2017-06-22 2 views
1

Je modale un contrôleur avec une animation de transition modale. Mais quand j'essaie de rejeter le contrôleur, le programme plante. Et Xcode n'a enregistré aucun message.iOS crash quand j'essaie de rejeter un modal

C'est un problème avec mon animation de transition. Quand je supprime le code de transition, il fonctionne bien.

alors quel est le problème avec mon code?

- (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]; 
} 

Répondre

0

Le problème réside probablement dans le déplacement de couches entre les autres couches. Vous essayez d'insérer des calques qui ont déjà une superposition ailleurs. Je ne sais pas pourquoi ça ne plante pas déjà lors de la présentation, mais ce n'est pas une surprise de le faire. Lorsque vous fermez les contrôleurs de vue, leur état est différent lorsque les contrôleurs de vue sont fermés. Principalement, toView est déjà sous-vue de containerView. Il était fromView lors de la présentation après tout. Avec votre code hiérarchique/hiérarchie de couche devient assez embrouillé et conduit finalement à un accident.

La solution est assez simple. Au lieu de créer séparément transformLayer qui détient d'autres calques et l'animer. Animez chaque couche séparément. Exemple:

-(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

Merci! J'ai été confondu avec ce problème depuis longtemps. – hecong