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

How to use custom view transitions in SwiftUI when navigating?

在基于 UIKit 的应用程序中,我们可以使用 UIViewControllerAnimatedTransitioning 协议进行自定义导航转换。

在 SwiftUI 中是否有等价物?

我知道我们已经可以在删除和添加视图之间进行动画处理。
但是当我们 push 和 pop 到导航堆栈时,我们该怎么做呢?


到目前为止,SwiftUI 的 API 中还没有类似的东西可用。确保向 Apple 提出增强请求。

自己实现"导航"是一个糟糕的主意,因为您基本上提供了 UINavigationController 提供的所有可访问性和设施支持。

相反,这里有一个建议:

通过自定义 SwiftUI 视图或修饰符,用 UIViewControllerRepresentable package器package NavigationView,该package器反过来设置 UIHostingController 子类,该子类等待 addChild(_:) 被调用,这将是导航控制器作为宿主控制器的子级添加。从这里开始,如果您的动画是"静态的"(例如,不需要任何子视图到子视图的转换),您可以通过实现导航控制器委托并提供动画控制器来完成此操作。

如果您确实需要更高级的过渡(例如 Photos.app 的照片过渡),您可以创建一个自定义 UIViewRepresentable package器,它将用作"来自"视图和"到"视图的标记,然后您可以使用那些在 UIKit 中发现的,例如可以在过渡中进行快照和动画制作。

提议的 API 如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()