iOS 9 transición personalizada – animationControllerForDismissedController no se llama

Soy un novato en el desarrollo de iOS y recientemente me topé con este problema con la transición personalizada en iOS 9.

Tengo un object conforme al protocolo UIViewControllerTransitioningDelegate e implemento animationControllerForDismissedController , algo así como:

 @implementation MyCustomizedTransitioningDelegate #pragma mark - UIViewControllerTransitioningDelegate - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed { MyCustomizedTransitionAnimator *animator = [[MyCustomizedTransitionAnimator alloc] init]; animator.presenting = NO; return animator; } @end 

Y el process que desencadena la transición modal es algo así como:

 @implementation MyViewController #pragma mark - Initializers + (MyCustomizedTransitioningDelegate *)modalTransitioningDelegateSingletonInstance; { static MyCustomizedTransitioningDelegate *delegateInst = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ delegateInst = [[MyCustomizedTransitioningDelegate alloc] init]; }); return delegateInst; } #pragma mark - UIViewController - (void)dismissViewControllerAnimated:(BOOL)animated completion:(void (^)(void))completion; { [self prepareForDismissViewControllerAnimated:animated completion:&completion]; [super dismissViewControllerAnimated:animated completion:completion]; } - (void)prepareForDismissViewControllerAnimated:(BOOL)animated completion:(dispatch_block_t *)completion; { self.presentedViewController.modalPresentationStyle = UIModalPresentationCustom; self.presentedViewController.transitioningDelegate = [[self class] modalTransitioningDelegateSingletonInstance]; } @end 

Dado que animationControllerForDismissedController método animationControllerForDismissedController no se llama, MyCustomizedTransitionAnimator no se crea, lo que lleva a su animateTransition no se llama, lo que causa un problema inesperado en mi aplicación. (Disculpa mi pobre ingles…)

También adjunto la captura de pantalla de seguimiento de stack para iOS8 y iOS9. En iOS 8, se llama a animationControllerForDismissedController después del rastreo de stack a continuación. iOS 8

Pero en iOS9, transitionDidFinish se llama de alguna manera por adelantado, lo que supongo que probablemente evitará que se llame a animationControllerForDismissedController ? iOS 9: se llama <code> transitionDidFinish </ code>

Me preguntaba si esto es un error de iOS 9 o no. ¡Cualquier explicación o solución de trabajo será muy apreciada!

Me enfrenté al mismo problema.

Espero que esto ayude a alguien.

Lo que me lo arregló es hacer que el object que aplica el protocolo UIViewControllerTransitioningDelegate como instancia variable mantenga una fuerte relación con él.

Creo que porque se descarta después de que la vista se presenta por primera vez.

Tuve el mismo problema.

Resultó que necesitaba configurar el delegado en el UIViewController de navigationController del UIViewController que contiene el button de disparo.

Tener este código antiguo que no funcionó:

 UIViewController *dvc = [self sourceViewController]; TransitionDelegate *transitionDelegate = [TransitionDelegate new]; dvc.modalPresentationStyle = UIModalPresentationCustom; dvc.transitioningDelegate = transitionDelegate; [dvc dismissViewControllerAnimated:YES completion:nil]; 

Cambié la primera línea a:

 UIViewController *dvc = [self sourceViewController].navigationController; 

Y funcionó.

Espero que esto ayude.

Necesitas decir algo como:

 MyDestinationViewController *viewController = [[MyDestinationViewController alloc] init]; MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init]; viewController.transitioningDelegate = transitioningDelegate; viewController.modalPresentationStyle = UIModalPresentationCustom; [self presentViewController: viewController animated:YES completion:nil]; 

O si está usando segues, en prepareForSegue diga algo como:

 MyDestinationViewController *toVC = segue.destinationViewController; MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init]; toVC.transitioningDelegate = transitioningDelegate;