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

SwiftUI 有可能吗?
bin*_*t84 -1
实际上我只是使用 SwiftUI 实现了这个。这就是我所做的:
1) 创建一个符合的 SwiftUI 视图UIViewControllerRepresentable.我使用 init 方法为其提供了类型为 SwiftUI 视图的数组在和方法AnyView.中还有一些工作要做,所以我们将回到这一点。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)
Run Code Online (Sandbox Code Playgroud)
其中animationDuration指定这将花费多长时间,moveViewsClosure正在应用转换,并且cleanUpClosure实际上正在将视图替换为另一个视图。
一旦您拥有符合要求的类,UIViewControllerAnimatedTransitioning您应该能够将其作为函数的输出返回UIViewControllerAnimatedTransitioning。
3) 现在您已经创建了委托和动画类,您可以将委托分配给UITabViewController我们开始的 SwiftUI 视图中的 a 。在结构的顶部,我创建了一个类型变量UITabViewController并使用默认的初始值设定项。在该init函数中,您应该将委托设置为我们上面创建的委托类的实例。
4) 现在我们可以实现makeUIViewController和 的updateUIViewController功能了。在其中,makeUIViewController您需要使用 加载视图数组,UIHostingController以使您的 SwiftUI 视图能够位于 UIKit 视图控制器中。加载完所有视图后,您可以UITabViewController从顶部返回。在 中updateUIViewController,您可能需要将委托重置为视图控制器。由于 SwiftUI 使用结构体,因此视图在更新时重新创建的情况并不少见;我发现它会因此失去对委托的引用,这就是我解决它的方法。
我意识到我可以提供所有代码,但它相当冗长,我认为如果您了解该过程,您将可以更轻松地对其进行故障排除。
| 归档时间: |
|
| 查看次数: |
1135 次 |
| 最近记录: |