最佳答案
我实际上只是使用 SwiftUI 实现了这个。这是我所做的:
1) 创建一个符合 UIViewControllerRepresentable 的 SwiftUI View 。
我使用 init 方法为其提供 AnyView 类型的 SwiftUI View 数组。
有一些工作需要完成在 makeUIViewController
和 updateUIViewController
方法中执行此操作,以便我们回过头来讨论这一点。
我创建了一个typealias
来传递 View 元组、它们的图像名称(假设您使用的是系统图像)和 View 名称。它看起来像这样:
typealias TabBarItemView = (ViewName: String, ImageName: String, TargetView: AnyView)
2) 您需要创建一个符合 UITabBarControllerDelegate 的类。
在该委托(delegate)中,您可以重写 tabBarController(_ tabBarController: UITabBarController,animationControllerForTransitionFrom fromVC: UIViewController, 到toVC: UIViewController) -> UIViewControllerAnimatedTransitioning
方法。
其中一部分要求您创建另一个符合 UIViewControllerAnimatedTransitioning 的类。
该类要求您实现两个函数: transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval
只需要您指定动画持续多长时间。
第二个函数是animateTransition(使用transitionContext:UIViewControllerContextTransitioning)
,它需要您做一些更繁重的工作。在此函数中,您需要设计移动 View 的动画。本质上,您应该应用 CGAffineTransform 来将 View 从屏幕外(想象一下屏幕左侧或右侧的舞台)移动到屏幕上,同时将另一个 View 以相同方向移出屏幕。在函数的末尾,您可以使用以下内容为变换设置动画:
UIView.animate(withDuration: animationDuration, animations: moveViewsClosure, completion: cleanUpClosure)
其中 animationDuration
指定这将花费多长时间,moveViewsClosure
正在应用转换,而 cleanUpClosure
实际上正在将 View 替换为另一个 View .
一旦您拥有符合 UIViewControllerAnimatedTransitioning
的类,您应该能够将其作为 UIViewControllerAnimatedTransitioning
函数的输出返回。
3) 现在您已经创建了委托(delegate)和动画类,您可以将委托(delegate)分配给我们开始的 SwiftUI View 中的 UITabViewController
。在结构的顶部,我创建了一个变量类型为 UITabViewController
并使用默认初始值设定项。在 init
函数中,您应该将委托(delegate)设置为我们上面创建的委托(delegate)类的实例。
4) 现在我们可以实现 makeUIViewController
和 updateUIViewController
函数。在 makeUIViewController
中,您需要使用 UIHostingController
加载 View 数组,以使您的 SwiftUI View 能够位于 UIKit View Controller 中。加载完所有 View 后,您可以从顶部返回 UITabViewController
。在 updateUIViewController
中,您可能需要重置 View Controller 的委托(delegate)。由于 SwiftUI 使用结构体,因此 View 在更新时重新创建的情况并不少见;我发现它会因此失去对委托(delegate)的引用,这就是我解决它的方法。
我意识到我可以提供所有代码,但它相当冗长,我认为如果您了解该过程,您将可以更轻松地对其进行故障排除。
关于swiftui - TabView 在 SwiftUI 动画选项卡之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57756080/