Vue du conteneur disparaissant sur completeTransition:

J'utilise des transitions de controller de vue personnalisées, UIViewControllerAnimatedTransitioning , pour présenter et rejeter un controller de vue.

L'animation de présentation fonctionne bien, mais quand j'exécute l'animation de rejet, une fois que j'appelle completeTransition: containerView est supprimé.

Je ne suis pas sûr de ce qui se passe, voici le code de transition:

 - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext { UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *containerView = [transitionContext containerView]; containerView.backgroundColor = [UIColor blackColor]; if (self.reverse) { [containerView addSubview:toViewController.view]; [containerView addSubview:fromViewController.view]; } else { [containerView addSubview:fromViewController.view]; [containerView addSubview:toViewController.view]; } if (! self.reverse) { // Forward toViewController.view.frame = CGRectMake(-containerView.frame.size.width, 0, containerView.frame.size.width, containerView.frame.size.height); } else { fromViewController.view.frame = CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height); } [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:0.75f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveLinear animations:^{ if (self.reverse) { fromViewController.view.frame = CGRectMake(-containerView.frame.size.width, 0, containerView.frame.size.width, containerView.frame.size.height); fromViewController.view.layer.opacity = 0.f; toViewController.view.layer.opacity = 1.f; } else { toViewController.view.frame = CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height); toViewController.view.layer.opacity = 1.f; fromViewController.view.layer.opacity = 0.3f; } } completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; } - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext { if (self.reverse) { return 0.45; } else { return 0.35; } } 

Comment puis-je empêcher mon toViewController de disparaître si .reverse est défini sur YES ?

Mise à jour: Voici comment je présente le controller de vue:

 SecondaryViewController *vc = [[SecondaryViewController alloc] init]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc]; navigationController.modalPresentationStyle = UIModalPresentationCustom; navigationController.transitioningDelegate = self; [self presentViewController:navigationController animated:YES completion:nil]; 

La vue de conteneur disparaissant lors du rejet est un comportement correct. Votre erreur est en fromView d'append le fromView .

Vous faites une distinction erronée entre la présentation ou le renvoi et ce que vous devez faire dans chaque cas. Utilisez simplement les deux controllers de vue de fromViewController et toViewController pour les différencier; en cas de licenciement, les rôles sont inversés. En cas de rejet, n'ajoutez rien à la vue du contenu. le présentateur d'origine est toujours présent et sera révélé par la suppression de la vue du conteneur.

Ainsi, lors de la présentation, ajoutez uniquement toView à la vue conteneur. En cas de rejet, n'ajoutez rien à la vue conteneur. C'est aussi simple que ça.