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

问题描述 投票:2回答:1

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

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9MeU1LNC5naWYifQ==” alt =“选项卡之间的动画开关”>

SwiftUI可以吗?

swiftui tabview
1个回答
0
投票

我实际上只是使用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使用结构,因此在更新视图时重新创建视图并不罕见。我发现它会因此失去对委托的引用,这就是我解决的方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.