2015-01-25 32 views
5

TabBar'daki sekmeler arasında etkileşimli animasyonlu geçişi uygulamaya çalışıyorum. Bir pan jest tanıyıcı kullanıyorum. Özel bir animasyon yaptım ve etkileşimi değiştirmek için UIPercentDrivenInteractiveTransition'ı kullandım. Ama öyle görünüyor ki, tüm animasyonun ardındaki süreci gerçekten anlamıyorum.
Etkileşimli olmayan bir animasyon yapmayı başardım, ancak etkileşim eklemek bir şekilde zordu. İnternetteki birçok öğreticiyi okudum ve herkesin gönderdiği kod parçalarının nasıl çalıştığını tam olarak anlıyorum ama bir şekilde benim durumumda bunu gerçekleştiremiyorum. Gezinme çubuğuyla 2 sekmeli bir TabBar uygulaması yaptım.Etkileşimli animasyonlu geçiş ile 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 
} 

} 

birisi bana bu anlamaya yardımcı olabilir: İşte
benim kodudur?

cevap

1

Sorununuzun jest tanıyıcıda olduğunu düşünüyorum. self.view yerine self.selectedViewController.view eklemeye çalışın.

Ayrıca, kodunuz yanlış: self.interactiveTransition = UIPercentDrivenInteractiveTransition()self.interactiveTransition = TransitionToLeft() olmalıdır.