答案 0 :(得分:-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
。在结构的顶部,我创建了一个类型为{ {1}},并使用默认的初始化程序。在UITabViewController
函数中,您应该将委托设置为我们在上面创建的委托类的实例。
4)现在我们可以实现init
和makeUIViewController
函数。在updateUIViewController
中,您需要使用makeUIViewController
加载视图数组,以使您的SwiftUI视图能够位于UIKit视图控制器中。加载所有视图后,您可以从顶部返回UIHostingController
。在UITabViewController
中,您可能需要将委托重置为视图控制器。由于SwiftUI使用结构,因此在更新视图时重新创建视图并不罕见。我发现它最终将失去对委托的引用,这就是我解决的方法。
我意识到我本可以提供所有代码,但是相当长,如果您理解该过程,那么您将可以更轻松地进行故障排除。