2015-01-25 3 views
5

Я пытаюсь реализовать интерактивный анимированный переход между вкладками в 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 
} 

} 

Может кто-то помочь мне понять это?

ответ

1

Я думаю, что ваша проблема в распознавании жестов. Попробуйте добавить его в self.selectedViewController.view вместо self.view.

Кроме того, ваш код является неправильным: self.interactiveTransition = UIPercentDrivenInteractiveTransition() должен быть self.interactiveTransition = TransitionToLeft() Я думаю.

Смежные вопросы