2017-11-15 2 views
0

사용자 지정 UIViewControllerAnimatedTransitioning AViewController에서 BViewController 사용자 지정 전환을 수행 할 때 큐빅 애니메이션을 사용하여 예상대로 수행 할 수 있지만 기본 iOS 프레젠테이션을 사용할 때처럼 BViewController에서 CViewController로 전환하는 모달, 전혀 애니메이션을 적용하지 않습니다.사용자 정의 UIViewController 전환 다음 애니메이션 않습니다 수행

가 여기에 첫 번째 전환 코드이다 : 나는 B에에서 SEGUE을 수행하는 또 다른 전환을 사용할 때

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

    } 



} 

는 것은조차 낯선 도착, C에 대한 B의 전환이 다시 작동하기 시작합니다.

2 전이 : 당신은 toView.layer.anchorPointZfromView.layer.anchorPointZ C에 B에서 전환이 일어날 그래서 수정하는

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

anchorPointZ입니다 엉망이되다.

절약하고 fromViewIntialTransformtoViewIntialTransform으로처럼 그것을 다시 설정하라는보십시오.

관련 문제