简化 SwiftUI 中模态视图呈现的管理。
SwiftUI 目前提供了两种不同的方式来管理模态视图的呈现
最简单的方式是 PresentationButton
,它接受一个 Destination
参数并在当前上下文中呈现它。它不提供手动关闭的控件,而是似乎依赖于作为新的默认 .pageSheet
模态视图呈现样式一部分的交互式关闭手势。
另一种更强大的方式是 presentation(_:)
修饰符,它允许你通过接受一个 Modal
类型的可选参数来自己控制呈现状态。
ModalPresentationView
位于两者之间,提供了一个 ModalPresentationButton
控件,它具有与 PresentationButton
相同的 API,但此外还
与 presentation(_:)
修饰符不同,它通过新的 ModalNavigationView
自动管理模态视图的状态。如果你熟悉 NavigationView
,那么你已经知道如何使用它。
除了现有的交互式关闭手势外,还通过 ModalDismissButton
提供手动关闭功能。
import ModalPresentationView
import SwiftUI
struct App: View {
var body: some View {
ModalPresentationView {
ModalPresentationButton(destination: DetailScreen()) {
Text("Present")
}
}
}
}
struct DetailScreen: View {
var body: some View {
ModalDismissButton {
Text("Dismiss")
}
}
}
在内部,ModalPresentationView
定义了两个自定义的环境键,然后使用它们在容器和按钮之间进行通信,无论它们在你的视图层次结构中的位置如何。
首先,ModalPresentationView
使用 .modalPresentAction
键将 present(_:)
闭包注入到环境中。
当被点击时,ModalPresentationButton
从环境中读取闭包并调用它,以通知 ModalPresentationView
触发呈现。呈现按钮通过首先将其包装在 AnyView
中,将目标视图传递到闭包中。
ModalPresentationView
更新其内部状态,以将目标视图传递到 presentation(_:)
视图修饰符中。它还使用 .modalDismissAction
环境键在呈现的视图的环境中设置一个 dismiss()
闭包。
最后,ModalDismissButton
从环境中读取 dismiss()
闭包,并在被点击时调用它,导致 ModalPresentationView
再次更新其内部状态并移除呈现的模态视图。
请参阅 CONTRIBUTING 文档以了解有关如何贡献的详细信息。
ModalPresentationView
版权归 (c) 2019 thoughtbot, inc. 所有。它包含根据 LICENSE 文件中规定的条款可以重新发布的免费软件。
ModalPresentationView
由 Adam Sharp 维护,并由 thoughtbot, inc. 资助。thoughtbot 的名称和徽标是 thoughtbot, inc. 的商标。