导航时如何在SwiftUI中使用自定义视图转换?
在基于UIKit的应用程序中,我们可以使用导航时如何在SwiftUI中使用自定义视图转换?,swiftui,Swiftui,在基于UIKit的应用程序中,我们可以使用UIViewControllerAnimatedTransitioning协议进行自定义导航转换 SwiftUI中是否有类似的软件 我知道我们已经可以在移除和添加视图之间设置动画。 但是,当我们推送并弹出导航堆栈时,我们如何做到这一点呢?到目前为止,SwiftUI的API中还没有类似的内容。确保向Apple发出增强请求 自行实现“导航”是一个糟糕的想法,因为基本上您提供了UINavigationController提供的所有可访问性和便利性支持 相反,这
UIViewControllerAnimatedTransitioning
协议进行自定义导航转换
SwiftUI中是否有类似的软件
我知道我们已经可以在移除和添加视图之间设置动画。
但是,当我们推送并弹出导航堆栈时,我们如何做到这一点呢?到目前为止,SwiftUI的API中还没有类似的内容。确保向Apple发出增强请求 自行实现“导航”是一个糟糕的想法,因为基本上您提供了
UINavigationController
提供的所有可访问性和便利性支持
相反,这里有一个建议:
通过自定义SwiftUI视图或修改器,使用UIViewControllerRepresentable
包装器包装NavigationView
,然后设置UIHostingController
子类,等待调用addChild(:)
,它将是作为宿主控制器的子级添加的导航控制器。从这里开始,如果动画是“静态的”(例如,不需要任何子视图到子视图的转换),您可以通过实现导航控制器委托并提供动画控制器来实现这一点
如果您确实需要更复杂的过渡(如Photos.app的照片过渡),您可以创建一个自定义的UIViewRepresentable
包装,它将作为“从”视图和“到”视图的标记,然后您可以使用UIKit中的发现,例如可以在过渡中进行快照和动画制作
建议的API可以如下所示:
struct ContentView1: View {
var body: some View {
NavigationLink(destination: DetailView()) {
Image("small").customSourceTarget()
}.navigationBarTitle("Navigation")
}
}
struct ContentView2: View {
var body: some View {
Image("large").customTransitionTarget()
}
}
NavigationView {
ContentView1()
}.customAnimatable()
标准
NavigationView
目前不允许对过渡进行自定义。您可以使用/创建自定义导航。举例来说,这个解决方案ASPRI是一个可怕的建议。这基本上打破了UINavigationController中内置的任何可访问性支持,以及提供的所有内置工具。就像web“应用程序”这样做很糟糕一样,SwiftUI也同样糟糕。正确的解决方案是手动包装UINavigationController,或者以其他方式获取对它的引用,这相当简单。