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
在下面的堆栈跟踪之后调用。
但在iOS9中, transitionDidFinish
被提前调用,我猜可能会阻止animationControllerForDismissedController
被调用?
我想知道这是不是一个iOS 9的错误。 任何解释或解决scheme将不胜感激!
我面临同样的问题。
我希望这会帮助别人。
对我来说固定的是使UIViewControllerTransitioningDelegate
协议作为variables实例的对象与它保持强大的关系。
我觉得因为第一次看到这个观点就被解雇了。
我遇到过同样的问题。
原来我需要在包含触发器button的UIViewController
的navigationController
上设置委托。
有这个旧的代码不起作用:
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;