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 视图数组 makeUIViewControllerupdateUIViewController 方法中有一些工作要做所以我们会回到那个。

我创建了一个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) 现在我们可以实现makeUIViewControllerupdateUIViewController 函数。在makeUIViewController 中,您需要使用UIHostingController 加载视图数组,以使您的SwiftUI 视图能够位于UIKit 视图控制器中。加载完所有视图后,您可以从顶部返回 UITabViewController。在updateUIViewController 中,您可能需要将委托重置为视图控制器。因为 SwiftUI 使用的是结构体,所以你的视图在更新时被重新创建并不少见;我发现它会因此失去对委托的引用,这就是我解决它的方法。

我意识到我本可以提供我的所有代码,但它相当冗长,我认为如果您了解该过程,您将更容易排除故障。

【讨论】:

以上是关于TabView 在为 SwiftUI 设置动画的选项卡之间切换的主要内容,如果未能解决你的问题,请参考以下文章

Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失

SwiftUI:输入字段键盘动画导致选项卡视图中的其他视图动画

如何保持动画在 TabView 视图变化上运行?

SwiftUI 无限 TabView 项

SwiftUI:在 TabView 中调整图像的位置

带有 TabView、SwiftUI 的水平分页滚动视图