2016-05-27 15 views
0

Was ich versuche zu tun ist eine benutzerdefinierte Animation von ViewController von der linken Seite schieben. Ich habe meinen benutzerdefinierten Transitionsdelegaten erstellt und stelle meine benutzerdefinierte Animation bereit, und alles funktioniert einwandfrei (neue Ansichtsdias von der linken Seite). Das einzige Problem ist, dass Push-Animation in iOS nicht nur zum Verschieben einer Ansicht von der rechten Seite ist. Der VC, der verdeckt wird, bewegt sich auch leicht in den gleichen Richtungen wie der VC, der gedrückt wird. Außerdem blinkt die Navigationsleiste irgendwie. Ich kann natürlich versuchen, dieses Verhalten nachzuahmen, indem ich rate, wie die Parameter sein sollen (zum Beispiel, wie stark die VC verdeckt ist, bewegt sich auf verschiedenen iPhones), aber vielleicht ist es möglich, die Werte irgendwo zu finden? Hilfe sehr geschätzt.PushViewController Details?

Antwort

0

Ich würde ein UIViewControllerAnimatedTransitioning Protokoll erstellen Objekt hält,

class CustomHorizontalSlideTransition: NSObject, UIViewControllerAnimatedTransitioning { 

    var operation: UINavigationControllerOperation = .Push 

    convenience init(operation: UINavigationControllerOperation) { 
     self.init() 
     self.operation = operation 
    } 

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { 
     return 0.5 
    } 

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 

     let containerView = transitionContext.containerView() 

     let disappearingVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! 
     let appearingVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! 

     let bounds = UIScreen.mainScreen().bounds 

     if self.operation == .Push { 
      appearingVC.view.frame = CGRectOffset(bounds, -bounds.size.height, 0) 
      containerView!.addSubview(disappearingVC.view) 
      containerView!.addSubview(appearingVC.view) 
     } else { 
      appearingVC.view.frame = bounds 
      disappearingVC.view.frame = bounds 
      containerView!.addSubview(appearingVC.view) 
      containerView!.addSubview(disappearingVC.view) 
     } 

     UIView.animateWithDuration(transitionDuration(transitionContext), 
      delay: 0.0, 
      options: UIViewAnimationOptions.CurveEaseInOut, 
      animations: {() -> Void in 

       if self.operation == .Push { 
        appearingVC.view.frame = bounds 
       } else { 
        disappearingVC.view.frame = CGRectOffset(bounds, -bounds.size.width, 0) 
       } 

      }) { (complete) -> Void in 
       transitionContext.completeTransition(true) 
     } 
    } 
} 

Dann in Ihrem "From" und "To" Ansicht-Controller, stellen Sie den Delegierten Navigationselbst in Sicht ViewDidAppear

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    navigationController?.delegate = self 
} 

Die in Beide View-Controller überschreiben Folgendes, um eine Delegate-Methode transitionAnimatedTransition bereitzustellen und die Protokoll-ständige Instanz für Ihre Animation zurückzugeben

override func transitionAnimatedTransition(operation: UINavigationControllerOperation) -> UIViewControllerAnimatedTransitioning? { 
     return CustomHorizontalSlideTransition(operation: operation) 
} 
Verwandte Themen