swiftui - TabView 在 SwiftUI 动画选项卡之间切换

标签 swiftui tabview

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

animated switch between tabs

SwiftUI 可以吗?

最佳答案

我实际上只是使用 SwiftUI 实现了这个。这是我所做的:

1) 创建一个符合 UIViewControllerRepresentable 的 SwiftUI View 。 我使用 init 方法为其提供 AnyView 类型的 SwiftUI View 数组。 有一些工作需要完成在 makeUIViewControllerupdateUIViewController 方法中执行此操作,以便我们回过头来讨论这一点。

我创建了一个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) 现在我们可以实现 makeUIViewControllerupdateUIViewController 函数。在 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/

相关文章:

javascript - 带有 ConfirmDialog 的 PrimeNg TabView

SwiftUI 2.0 - TabView 标签栏颜色不符合当前的配色方案(深色或浅色模式)

通过协议(protocol)继承的 SwiftUI 可重用 View

ios - 我正在尝试制作一种选择器样式,例如设置中的外观选择器

swift - 在范围 SwiftUI 中找不到 'entity'

jsf-2 - p :tabView: direct link to tab

nativescript - 隐藏 Nativescript-Angular TabView 上的选项卡按钮

swift - 添加自定义字体作为字体类型 SwiftUI 的扩展

swift - 如何在 Swift 5.5 中将 async/await 与 SwiftUI 一起使用?

android - 移动到 tabview 中的另一个选项卡时停止 handler.postDelayed