iOS 9自定义转换 – animationControllerForDismissedController不被调用

我是iOS开发的新手,最近遇到了这个问题,在iOS 9中进行自定义转换。

我有一个对象符合UIViewControllerTransitioningDelegate协议,并实现animationControllerForDismissedController ,如下所示:

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

触发模式转换的过程如下所示:

 @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 

由于未调用animationControllerForDismissedController方法,因此未创buildMyCustomizedTransitionAnimator ,导致未调用其animateTransition ,这会在我的应用程序中导致意外问题。 (对不起,我英文很差…)

我也附上iOS8和iOS9的堆栈跟踪截图。 在iOS 8中, animationControllerForDismissedController在下面的堆栈跟踪之后调用。 iOS 8

但在iOS9中, transitionDidFinish被提前调用,我猜可能会阻止animationControllerForDismissedController被调用? iOS 9:<code> transitionDidFinish </ code>被调用

我想知道这是不是一个iOS 9的错误。 任何解释或解决scheme将不胜感激!

我面临同样的问题。

我希望这会帮助别人。

对我来说固定的是使UIViewControllerTransitioningDelegate协议作为variables实例的对象与它保持强大的关系。

我觉得因为第一次看到这个观点就被解雇了。

我遇到过同样的问题。

原来我需要在包含触发器button的UIViewControllernavigationController上设置委托。

有这个旧的代码不起作用:

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

我把第一行改为:

 UIViewController *dvc = [self sourceViewController].navigationController; 

它的工作。

希望这可以帮助。

你需要像这样说:

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

或者如果你正在使用segues,在prepareForSegue中就会说:

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