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

问题描述

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

SwiftUI中是否有等效项?

我知道我们已经可以在删除添加视图之间建立动画。 但是当我们推入并弹出导航堆栈时我们该怎么做?

解决方法

到目前为止,SwiftUI的API中没有类似的功能。确保通过Apple打开增强功能请求。

独自实现“导航”是一个糟糕的想法,因为您基本上会提供UINavigationController所提供的所有可访问性和设施支持。

相反,这是一个建议:

通过自定义SwiftUI视图或修饰符,用NavigationView包装器包装UIViewControllerRepresentable,然后再包装一个UIHostingController子类,该子类等待{{1} },它将是作为主机控制器的子级添加的导航控制器。从这里开始,如果您的动画是“静态”的(例如,不需要任何子视图到子视图的过渡),则可以在此处通过实现导航控制器委托并提供动画控制器来实现此目的。

如果您确实需要更多演变的过渡(例如Photos.app的照片过渡),则可以创建自定义addChild(_:)包装器,该包装器将用作“从”视图和“至”视图的标记,您可以然后在UIKit中使用这些发现,例如可以在过渡中进行快照和动画。

建议的API如下所示:

UIViewRepresentable