2015-01-25 14 views
5

Ich versuche, interaktive animierte Übergang zwischen Tabs in einer TabBar zu implementieren. Ich benutze einen Pan-Gesten-Erkenner. Ich habe eine benutzerdefinierte Animation erstellt und verwende UIPercentDrivenInteractiveTransition, um das Wechseln interaktiv zu gestalten. Aber es scheint, dass ich den Prozess, der hinter der ganzen Animation steckt, nicht wirklich verstehe.
Ich habe es geschafft, eine nicht interaktive Animation zu erstellen, aber das Hinzufügen von Interaktivität war irgendwie schwierig. Ich lese viele Tutorials im Internet und ich verstehe vollständig, wie die Code-Snippets funktionieren, die jeder postet, aber ich kann es irgendwie nicht in meinem Fall implementieren. Ich habe eine TabBar-Anwendung mit 2 Tabs mit Navigationsleiste erstellt.
Hier ist mein Code:TabBarController mit interaktiven animierten Übergang

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 
} 

} 

Kann mir jemand dabei helfen herauszufinden?

Antwort

1

Ich denke, Ihr Problem ist in Gestenerkennung. Versuchen Sie, es zu self.selectedViewController.view statt self.view hinzuzufügen.

Auch Ihr Code ist falsch: self.interactiveTransition = UIPercentDrivenInteractiveTransition() sollte self.interactiveTransition = TransitionToLeft() sein Ich denke.

Verwandte Themen