Я пытаюсь реализовать интерактивный анимированный переход между вкладками в TabBar. Я использую распознаватель жесты. Я сделал пользовательскую анимацию и использовал UIPercentDrivenInteractiveTransition, чтобы сделать интерактивное взаимодействие. Но мне кажется, что я действительно не понимаю процесс, который стоит за всей анимацией.
Мне удалось сделать неинтерактивную анимацию, но добавить интерактивность было как-то трудно. Я прочитал много учебников в Интернете, и я полностью понимаю, как фрагменты кода, которые публикуют все сообщения, но я каким-то образом не могу его реализовать в моем случае. Я сделал приложение TabBar с двумя вкладками с навигационной панелью.
Вот мой код:TabBarController с интерактивным анимированным переходом
TabBarController.swift
import UIKit
class TabBarController: UITabBarController, UITabBarControllerDelegate {
var usingGesture = false
var interactiveTransition:UIPercentDrivenInteractiveTransition?
override func viewDidLoad() {
super.viewDidLoad()
let panGesture = UIPanGestureRecognizer(target: self, action: "didPan:")
self.view.addGestureRecognizer(panGesture)
self.delegate = self
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tabBarController(tabBarController: UITabBarController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return self.interactiveTransition
}
func didPan(gesture: UIPanGestureRecognizer){
let point = gesture.locationInView(gesture.view)
let percent = fmax(fmin((point.x/300.0), 0.99), 0.0)
self.interactiveTransition = UIPercentDrivenInteractiveTransition()
switch (gesture.state){
case .Began:
self.usingGesture = true
self.selectedIndex++
case .Changed:
self.interactiveTransition?.updateInteractiveTransition(percent)
case .Ended, .Cancelled:
if percent > 0.5 {
self.interactiveTransition?.finishInteractiveTransition()
} else {
self.interactiveTransition?.cancelInteractiveTransition()
}
self.usingGesture = false
default:
NSLog("Unhandled state")
}
}
}
TransitionToLeft.swift
import UIKit
class TransitionToLeft: UIPercentDrivenInteractiveTransition, UIViewControllerAnimatedTransitioning {
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromView:UIView = transitionContext.viewForKey(UITransitionContextFromViewKey)!
let toView:UIView = transitionContext.viewForKey(UITransitionContextToViewKey)!
transitionContext.containerView().addSubview(fromView)
transitionContext.containerView().addSubview(toView)
toView.frame = CGRectMake(toView.frame.width, 0, toView.frame.width, toView.frame.height)
let fromNewFrame = CGRectMake(-1 * fromView.frame.width, 0, fromView.frame.width, fromView.frame.height)
UIView.animateWithDuration(0.7, animations:{() -> Void in
toView.frame = fromView.frame
fromView.frame = fromNewFrame
},{ (Bool) -> Void in
// update internal view - must always be called
transitionContext.completeTransition(true)
})
}
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 0.7
}
}
Может кто-то помочь мне понять это?