2017-11-15 12 views
0

カスタムUIViewControllerAnimatedTransitioningを使用してAViewControllerからBViewControllerへのカスタムトランジションを実行すると、キュービックアニメーションを使用して期待どおりに動作しますが、デフォルトのiOSプレゼンテーションBViewControllerからCViewControllerに移行するモーダルで、アニメーション化されません。カスタムUIViewControllerの遷移で次のアニメーションが実行されない

はここで最初の遷移のコードです:私はAからBにセグエを実行するために別のトランジションを使用する場合

class CubeTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning { 
    private var direction: Direction! 

    convenience init(direction: Direction) { 
     self.init() 
     self.direction = direction 
    } 

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 1 
    } 

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let containerView = transitionContext.containerView 
     guard let fromView = transitionContext.view(forKey: .from), 
       let toView = transitionContext.view(forKey: .to) else { 
       return 
     } 
     toView.frame = fromView.frame 

     containerView.backgroundColor = UIColor.white 
     let fromViewIntialTransform = fromView.layer.transform 

     fromView.layer.anchorPointZ = -((fromView.frame.size.width)/2) 
     var transform: CATransform3D = CATransform3DIdentity 
     transform.m34 = -1.0/1000 
     transform = CATransform3DTranslate(transform, 0, 0, (fromView.layer.anchorPointZ)) 
     fromView.layer.transform = transform 
     containerView.addSubview(fromView) 

     toView.alpha = 1 
     fromView.alpha = 1 

     let toViewIntialTransform = toView.layer.transform 
     toView.layer.anchorPointZ = -((toView.frame.size.width)/2) 
     transform = CATransform3DIdentity 
     transform.m34 = -1.0/1000 
     transform = CATransform3DTranslate(transform, 0, 0, (toView.layer.anchorPointZ)) 
     toView.layer.transform = transform 

     containerView.insertSubview(toView, belowSubview:fromView) 

     // transform toView to it's begining position 
     switch direction { 
     case .left:          // t      angle     x y z 
      toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(-Double.pi/2), 0, 1, 0) 
     case .right: 
      toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(Double.pi/2), 0, 1, 0) 
     case .up: 
      toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(Double.pi/2), 1, 0, 0) 
     case .down: 
      toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(-Double.pi/2), 1, 0, 0) 
     default: 
      break 
     } 


     UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0.0, options: UIViewAnimationOptions(), animations: { 


      // Animate toView to go to fromView initial position, 
      // And the fromView to go to a new position 
      switch self.direction { 
      case .left:          // t      angle     x y z 
       toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(Double.pi/2), 0, 1, 0) 
       fromView.layer.transform = CATransform3DRotate((fromView.layer.transform), CGFloat(Double.pi/2), 0, 1, 0) 
      case .right: 
       toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(-Double.pi/2), 0, 1, 0) 
       fromView.layer.transform = CATransform3DRotate((fromView.layer.transform), CGFloat(-Double.pi/2), 0, 1, 0) 
      case .up: 
       toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(Double.pi/2), 1, 0, 0) 
       fromView.layer.transform = CATransform3DRotate((fromView.layer.transform), CGFloat(Double.pi/2), 1, 0, 0) 
      case .down: 
       toView.layer.transform = CATransform3DRotate((toView.layer.transform), CGFloat(-Double.pi/2), 1, 0, 0) 
       fromView.layer.transform = CATransform3DRotate((fromView.layer.transform), CGFloat(-Double.pi/2), 1, 0, 0) 
      default: 
       break 
      } 
     }, completion: {(value: Bool) in 
      fromView.layer.transform = fromViewIntialTransform 
      toView.layer.transform = toViewIntialTransform 
      fromView.layoutSubviews() 
      toView.layoutSubviews() 
      // This undo the transition if it's cancelled 
      transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
     }) 

    } 



} 

事も見知らぬ人を取得、BからCへの移行は、再び作業を開始します。

第二遷移:BからCへの遷移が発生しようとするとき

class PopTransition: NSObject, UIViewControllerAnimatedTransitioning { 

    let duration = 0.3 
    var originFrame = CGRect.zero 
    var presenting = true 

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return duration 
    } 

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 
     let containerView = transitionContext.containerView 
     let toView = transitionContext.view(forKey: .to)! 
     let detailView = presenting ? toView : transitionContext.view(forKey: .from)! 

     let initialFrame = presenting ? originFrame : detailView.frame 
     let finalFrame = presenting ? detailView.frame : originFrame 

     let xScaleFactor = presenting 
      ? initialFrame.width/finalFrame.width 
      : finalFrame.width/initialFrame.width 

     let yScaleFactor = presenting 
      ? initialFrame.height/finalFrame.height 
      : finalFrame.height/initialFrame.height 

     let scaleTransform = CGAffineTransform(scaleX: xScaleFactor, y: yScaleFactor) 

     if presenting { 
      detailView.transform = scaleTransform 
      detailView.center = CGPoint(
       x: initialFrame.midX, 
       y: initialFrame.midY) 
     } 

     containerView.addSubview(toView) 
     containerView.bringSubview(toFront: detailView) 

     UIView.animate(
      withDuration: duration, 
      delay: 0.0, 
      animations: { 
       detailView.transform = self.presenting ? .identity : scaleTransform 
       detailView.center = CGPoint(x: finalFrame.midX, y: finalFrame.midY) 
     }, 
      completion:{_ in 
       transitionContext.completeTransition(!transitionContext.transitionWasCancelled) 
     } 
     ) 
    } 
} 

答えて

1

あなたはtoView.layer.anchorPointZfromView.layer.anchorPointZを変更しているので、anchorPointZでありますうんざりする

あなたはfromViewIntialTransformtoViewIntialTransformで行うようにそれを保存してreseting試してみてください。

関連する問題