2016-05-27 17 views
0

私は何をしようとしています側からViewControllerを押すのカスタムアニメーションです。 私は自分のカスタムトランジションデリゲートを作成しました。私はカスタムアニメーションを提供していますが、すべて正常に動作します(新しいビューは左側からスライドします)。 唯一の問題は、iOSのプッシュアニメーションは、右側からビューをスライドさせることだけではないことです。隠れているVCも、VCが押し込まれているのと同じ方向にわずかに動いています。また、ナビゲーションバーが点滅します。私はもちろんパラメータが何であるべきかを推測することでこの振る舞いを模倣しようとすることができます(たとえば、VCがどのくらい隠れているかは別のiPhoneで動きます)が、値をどこかで見つけることは可能でしょうか? 大変助かりました。PushViewController詳細?

答えて

0

私はあなたの「From」に続いてオブジェクト

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) 
     } 
    } 
} 

を遵守UIViewControllerAnimatedTransitioningプロトコルを作成し、ビュー・コントローラ「へ」、

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

ViewDidAppearビューで自己にしnavigationControllerのデリゲートを設定します両方のビューコントローラは、transitionAnimatedTransitionデリゲートメソッドを提供し、アニメーションのプロトコル準拠のインスタンスを返すために以下をオーバーライドします

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