我有一个TabView
,我想在页面之间进行动画切换,如下所示:https://stackoverflow.com/a/54774397/5376525
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9MeU1LNC5naWYifQ==” alt =“选项卡之间的动画开关”>
SwiftUI可以吗?
我实际上只是使用SwiftUI实现的。这是我所做的:
1]创建一个符合UIViewControllerRepresentable.
的SwiftUI视图,我使用init方法为它提供了类型为AnyView.
的SwiftUI视图数组。makeUIViewController
和updateUIViewController
方法中需要做一些工作,因此我们将回到这一点。
我创建了一个typealias
以传递视图元组,它们的图像名称(假设您使用的是系统图像)和视图名称。看起来像这样:
typealias TabBarItemView = (ViewName: String, ImageName: String, TargetView: AnyView)
2)您需要创建一个与该委托中的UITabBarControllerDelegate.
一致的类,您可以覆盖tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning
方法。
部分内容要求您创建另一个类,该类符合UIViewControllerAnimatedTransitioning.
。此类需要您实现两个功能:transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval
,仅需要您指定动画持续多长时间。
第二个功能是animateTransition(using transitionContext: UIViewControllerContextTransitioning)
,它需要您进行一些较重的提升。在此功能内,您需要设计用于移动视图的动画。本质上,您应该应用CGAffineTransform
,将视图从屏幕外(在屏幕的左侧或右侧移动一个舞台)移动到屏幕上,同时以相同方向在屏幕外移动其他视图。在该函数的结尾,您可以使用以下方式为转换设置动画:
UIView.animate(withDuration: animationDuration, animations: moveViewsClosure, completion: cleanUpClosure)
animationDuration
指定将花费多长时间,moveViewsClosure
正在应用转换,而cleanUpClosure
实际上是用另一个视图替换视图。
一旦您拥有符合UIViewControllerAnimatedTransitioning
的类,您就应该能够将其作为UIViewControllerAnimatedTransitioning
函数的输出返回。
3)现在,您已经创建了委托和动画类,您可以在我们开始的SwiftUI视图中将委托分配给UITabViewController
。在结构的顶部,我创建了一个类型为UITabViewController
的变量,然后使用默认的初始化程序。在init
函数中,您应该将委托设置为我们在上面创建的委托类的实例。
4)现在我们可以实现makeUIViewController
和updateUIViewController
功能。在makeUIViewController
中,您需要使用UIHostingController
加载视图数组,以使您的SwiftUI视图能够位于UIKit视图控制器中。加载所有视图后,您可以从顶部返回UITabViewController
。在updateUIViewController
中,您可能需要将委托重置为视图控制器。由于SwiftUI使用结构,因此在更新视图时重新创建视图并不罕见。我发现它会因此失去对委托的引用,这就是我解决的方法。
[我知道我本可以提供所有代码,但是相当长,如果您理解该过程,那么您将可以更轻松地对其进行故障排除。