Vista de contenedor desapareciendo en completa Transición:

Estoy usando las transiciones personalizadas del controller de vista, UIViewControllerAnimatedTransitioning , para presentar y descartar un controller de vista.

La animation de presentación funciona bien, pero cuando ejecuto la animation de rechazo, una vez que hago call completeTransition: se retira el containerView .

No estoy seguro de lo que está sucediendo, aquí está el código de transición:

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

¿Cómo puedo evitar que my toViewController desaparezca si .reverse está configurado en YES ?

Actualización: así es como presento el controller de vista:

 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 vista del contenedor que desaparece al despido es el comportamiento correcto. Su error es agregarle el fromView .

Está distinguiendo incorrectamente si esto es presentación o despido y qué debe hacer en cada caso. Simplemente use los dos controlleres de vista de fromViewController y toViewController para distinguirlos; Al despido, los papeles se invierten. Al despido, no agregue nada a la vista de contenido; el presentador original todavía está presente y se revelará mediante la eliminación de la vista del contenedor.

Entonces, en la presentación, agregue solo el toView a la vista del contenedor. Al finalizar, no agregue nada a la vista del contenedor. Es tan simple como eso.