首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为SwiftUI设置动画的TabView选项卡之间的切换

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

Stack Overflow用户
提问于 2019-09-02 19:22:18
回答 1查看 1.2K关注 0票数 5

我有一个TabView,我想在页面之间进行动画切换,就像这样:https://stackoverflow.com/a/54774397/5376525

SwiftUI有可能实现吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-05 09:43:51

我实际上是用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,它将视图从屏幕外(想象一个舞台在屏幕的左边或右边)移到屏幕上,同时将另一个视图移到屏幕外的相同方向上。在函数的末尾,您可以使用以下内容为变换设置动画:

代码语言:javascript
运行
复制
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使用结构,所以在更新视图时重新创建它并不少见;我发现它会丢失对委托的引用,这就是我解决它的方法。

我意识到我本可以提供我所有的代码,但它相当冗长,我认为如果你理解这个过程,你会更容易排除它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57756080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档