TabView 在为 SwiftUI 设置动画的选项卡之间切换
Posted
技术标签:
【中文标题】TabView 在为 SwiftUI 设置动画的选项卡之间切换【英文标题】:TabView switching between tabs animated for SwiftUI 【发布时间】:2020-01-05 10:33:36 【问题描述】:我有一个TabView
,我想在页面之间进行动画切换,如下所示:
https://***.com/a/54774397/5376525
SwiftUI 可以吗?
【问题讨论】:
【参考方案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
。在结构的顶部,我创建了一个 UITabViewController
类型的变量并使用默认初始化程序。在init
函数中,您应该将委托设置为我们在上面创建的委托类的实例。
4) 现在我们可以实现makeUIViewController
和updateUIViewController
函数。在makeUIViewController
中,您需要使用UIHostingController
加载视图数组,以使您的SwiftUI 视图能够位于UIKit 视图控制器中。加载完所有视图后,您可以从顶部返回 UITabViewController
。在updateUIViewController
中,您可能需要将委托重置为视图控制器。因为 SwiftUI 使用的是结构体,所以你的视图在更新时被重新创建并不少见;我发现它会因此失去对委托的引用,这就是我解决它的方法。
我意识到我本可以提供我的所有代码,但它相当冗长,我认为如果您了解该过程,您将更容易排除故障。
【讨论】:
以上是关于TabView 在为 SwiftUI 设置动画的选项卡之间切换的主要内容,如果未能解决你的问题,请参考以下文章
Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失