简化 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. 的商标。