导航时如何在SwiftUI中使用自定义视图转换?

导航时如何在SwiftUI中使用自定义视图转换?,swiftui,Swiftui,在基于UIKit的应用程序中,我们可以使用UIViewControllerAnimatedTransitioning协议进行自定义导航转换 SwiftUI中是否有类似的软件 我知道我们已经可以在移除和添加视图之间设置动画。 但是,当我们推送并弹出导航堆栈时,我们如何做到这一点呢?到目前为止,SwiftUI的API中还没有类似的内容。确保向Apple发出增强请求 自行实现“导航”是一个糟糕的想法,因为基本上您提供了UINavigationController提供的所有可访问性和便利性支持 相反,这

在基于UIKit的应用程序中,我们可以使用
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,或者以其他方式获取对它的引用,这相当简单。