发布于 2020-02-05 09:43:51
我实际上是用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
。在结构的顶部,我创建了一个UITabViewController
类型的变量,并使用了默认的初始化器。在init
函数中,您应该将委托设置为我们上面创建的委托类的一个实例。
4)现在我们可以实现makeUIViewController
和updateUIViewController
函数了。在makeUIViewController
中,您需要使用UIHostingController
加载视图数组,以使您的SwiftUI视图位于UIKit视图控制器中。加载完所有视图后,可以从顶部返回UITabViewController
。在updateUIViewController
中,您可能需要将委托重置为视图控制器。因为SwiftUI使用结构,所以在更新视图时重新创建它并不少见;我发现它会丢失对委托的引用,这就是我解决它的方法。
我意识到我本可以提供我所有的代码,但它相当冗长,我认为如果你理解这个过程,你会更容易排除它。
https://stackoverflow.com/questions/57756080
复制相似问题