Используйте метод UITabBarControllerDelegate
:
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
Основная часть работы находится в классе, который соответствует UIViewControllerAnimatedTransitioning
.
Вот реализация, которая пересекает два контроллера.
MyFadeTransition.swift:
import UIKit
class MyFadeTransition: NSObject, UIViewControllerAnimatedTransitioning {
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
if let fromVC = transitionContext.viewController(forKey: .from), let toVC = transitionContext.viewController(forKey: .to) {
toVC.view.frame = fromVC.view.frame
toVC.view.alpha = 0
fromVC.view.alpha = 1
transitionContext.containerView.addSubview(fromVC.view)
transitionContext.containerView.addSubview(toVC.view)
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
toVC.view.alpha = 1
}) { (finished) in
transitionContext.completeTransition(finished)
}
}
}
func animationEnded(_ transitionCompleted: Bool) {
// no-op
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
}
Что-то в вашем коде должно быть контроллером панели вкладок delegate
. Установите это, а затем реализуйте метод делегата в этом классе.
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let fade = MyFadeTransition()
return fade
}
Обратите внимание, что этот же класс MyFadeTransition
можно использовать с UINavigationController
. UINavigationControllerDelegate
имеет один и тот же базовый метод, поэтому вы можете повторно использовать класс перехода как для контроллеров панели вкладок, так и для контроллеров навигации.
Предполагая, что ваш контроллер панели вкладок является корневым контроллером вашего приложения, вы можете добавить следующий код в didFinishLaunchingWithOptions
вашего AppDelegate:
let tab = window!.rootViewController as! UITabBarController
tab.delegate = self
Затем добавьте:
extension AppDelegate: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let fade = MyFadeTransition()
return fade
}
}
в AppDelegate.swift.