2017-06-22 38 views
1

我模態控制器與模態過渡動畫。但是,當我試圖解僱控制器時,程序崩潰。而且Xcode沒有記錄任何消息。iOS崩潰時,我試圖解僱模態

我的過渡動畫出現問題。當我刪除轉換代碼時,它運行良好。

那麼我的代碼有什麼問題?

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { 
    _transitionContext = transitionContext; 
    UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; 
    UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; 
    CALayer *toVcLayer = [CALayer layer]; 
    toVcLayer.frame = toView.layer.frame; 
    [toVcLayer addSublayer:toView.layer]; 

    _transformLayer = [CATransformLayer layer]; 
    _transformLayer.frame = [UIScreen mainScreen].bounds; 
    [_transformLayer addSublayer:fromView.layer]; 
    CATransform3D ct = CATransform3DIdentity; 
    ct = CATransform3DMakeTranslation(0.0, 0.0, -1.0); 
    ct = CATransform3DRotate(ct, M_PI, 0.0, 1.0, 0.0); 
    toVcLayer.transform = ct; 
    [_transformLayer addSublayer:toVcLayer]; 

    CATransform3D at = CATransform3DIdentity; 
    at = CATransform3DRotate(at, M_PI, 0.0, 1.0, 0.0); 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.toValue = [NSValue valueWithCATransform3D:at]; 
    animation.duration = 1.0; 
    animation.delegate = self; 
    [_transformLayer addAnimation:animation forKey:nil]; 

    [transitionContext.containerView.layer addSublayer:_transformLayer]; 
} 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
    [_transitionContext.containerView addSubview:[_transitionContext viewForKey:UITransitionContextToViewKey]]; 
    [_transitionContext completeTransition:YES]; 
} 

回答

0

問題可能在於移動其他圖層之間的圖層。您試圖插入已經在其他地方有超級圖層的圖層。我不知道爲什麼它不會在提交時崩潰,但它在解僱時並不意外。

解散視圖控制器時,它們的狀態是不同的。主要是,toView已經是containerView的子視圖。畢竟,提交時是fromView。隨着你的代碼視圖/圖層層次結構變得相當糾結,並最終導致崩潰。

解決方案非常簡單。而不是創建單獨的transformLayer,其中包含其他圖層並對其進行動畫處理。單獨爲每個圖層動畫。例如:

-(void)animateTransition(id<UIViewControllerContextTransitioning>)transitionContext { 
    _transitionContext = transitionContext; 
    UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey]; 
    UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; 

    if (toView.superview == nil) 
     [transitionContext.containerView addSubview:toView]; 

    const NSTimeInterval duration = 1.0; 
    const CGFloat translationX = 400.0; 

    toView.layer.transform = CATransform3DMakeTranslation(translationX, 0.0, 0.0); 

    CABasicAnimation *toAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    toAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
    toAnimation.duration = duration; 
    toAnimation.delegate = self; 

    CABasicAnimation *fromAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    fromAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-translationX, 0.0, 0.0]; 
    fromAnimation.duration = duration; 

    [fromView addAnimation:fromAnimation forKey:nil]; 
    [toView addAnimation:toAnimation forKey:nil]; 
} 

-(void)animationDidStop:(CAAnimation*)anim finished:(BOOL)flag { 
    [_transitionContext completeTransition:YES]; 
} 
+0

謝謝!很長一段時間我一直困惑這個問題。 – hecong