TabView在为SwiftUI设置动画的选项卡之间切换

时间:2019-09-02 11:22:17

标签: swiftui tabview

我有一个TabView,我想在页面之间进行动画切换,如下所示: https://stackoverflow.com/a/54774397/5376525

animated switch between tabs

SwiftUI是否可能?

1 个答案:

答案 0 :(得分:-1)

我实际上只是使用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。在结构的顶部,我创建了一个类型为{ {1}},并使用默认的初始化程序。在UITabViewController函数中,您应该将委托设置为我们在上面创建的委托类的实例。

4)现在我们可以实现initmakeUIViewController函数。在updateUIViewController中,您需要使用makeUIViewController加载视图数组,以使您的SwiftUI视图能够位于UIKit视图控制器中。加载所有视图后,您可以从顶部返回UIHostingController。在UITabViewController中,您可能需要将委托重置为视图控制器。由于SwiftUI使用结构,因此在更新视图时重新创建视图并不罕见。我发现它最终将失去对委托的引用,这就是我解决的方法。

我意识到我本可以提供所有代码,但是相当长,如果您理解该过程,那么您将可以更轻松地进行故障排除。