gpt4 book ai didi

ios - 如何使用 CrossDissolve 幻灯片过渡动画标签栏选项卡切换?

转载 作者:IT王子 更新时间:2023-10-29 05:24:31 28 4
gpt4 key购买 nike

我正在尝试在 UITabBarController 上创建一个过渡效果,有点类似于 Facebook 应用程序。我设法在选项卡开关上获得了“滚动效果”,但我似乎无法弄清楚如何交叉溶解(或者它至少不起作用)。

这是我当前的代码:

import UIKit

class ScrollingTabBarControllerDelegate: NSObject, UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {

return ScrollingTransitionAnimator(tabBarController: tabBarController, lastIndex: tabBarController.selectedIndex)
}
}

class ScrollingTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning {
weak var transitionContext: UIViewControllerContextTransitioning?
var tabBarController: UITabBarController!
var lastIndex = 0

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.2
}

init(tabBarController: UITabBarController, lastIndex: Int) {
self.tabBarController = tabBarController
self.lastIndex = lastIndex
}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
self.transitionContext = transitionContext

let containerView = transitionContext.containerView
let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)

containerView.addSubview(toViewController!.view)

var viewWidth = toViewController!.view.bounds.width

if tabBarController.selectedIndex < lastIndex {
viewWidth = -viewWidth
}

toViewController!.view.transform = CGAffineTransform(translationX: viewWidth, y: 0)

UIView.animate(withDuration: self.transitionDuration(using: (self.transitionContext)), delay: 0.0, usingSpringWithDamping: 1.2, initialSpringVelocity: 2.5, options: .transitionCrossDissolve, animations: {
toViewController!.view.transform = CGAffineTransform.identity
fromViewController!.view.transform = CGAffineTransform(translationX: -viewWidth, y: 0)
}, completion: { _ in
self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled)
fromViewController!.view.transform = CGAffineTransform.identity
})
}
}

如果有人知道如何让这个工作,那就太好了,现在已经尝试了好几天没有进展......:/

编辑:我通过将 UIView.animate block 替换为:

UIView.transition(with: containerView, duration: 0.2, options: .transitionCrossDissolve, animations: {

toViewController!.view.transform = CGAffineTransform.identity
fromViewController!.view.transform = CGAffineTransform(translationX: -viewWidth, y: 0)

}, completion: { _ in

self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled)
fromViewController!.view.transform = CGAffineTransform.identity

})

但是,动画真的很慢而且不可用:(

编辑 2:对于尝试使用这些片段的人,不要忘记连接 UITabBarController 的委托(delegate),否则什么也不会发生。

编辑 3: 我找到了一个 Swift 库,它完全符合我的要求: https://github.com/Interactive-Studio/TransitionableTab

最佳答案

有一种更简单的方法可以做到这一点。在标签栏委托(delegate)中添加以下代码:

使用 Swift 2、3 和 4

class MySubclassedTabBarController: UITabBarController {

override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}

extension MySubclassedTabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

guard let fromView = selectedViewController?.view, let toView = viewController.view else {
return false // Make sure you want this as false
}

if fromView != toView {
UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionCrossDissolve], completion: nil)
}

return true
}
}

编辑(2018 年 4 月 23 日)由于这个答案越来越受欢迎,我更新了代码以删除强制展开,这是一种不好的做法,并添加了 guard 语句。

编辑(2018 年 7 月 11 日)@AlbertoGarcía 是对的。如果你点击标签栏图标两次,你会得到一个空白屏幕。所以我加了一张额外的支票

关于ios - 如何使用 CrossDissolve 幻灯片过渡动画标签栏选项卡切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346280/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com