[英]iOS 9 custom transition - animationControllerForDismissedController not called
我是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
方法,因此未创建MyCustomizedTransitionAnimator
,这导致其animateTransition
未被调用,这会导致我的应用程序出现意外问题。 (抱歉我的英语不好......)
我还附上了iOS8和iOS9的堆栈跟踪截图。 在iOS 8中,在下面的堆栈跟踪之后调用animationControllerForDismissedController
。
但是在iOS9中,提前以某种方式调用transitionDidFinish
,我猜可能会阻止animationControllerForDismissedController
被调用?
我想知道这是不是iOS 9的错误。 任何解释或解决方案将不胜感激!
我遇到了同样的问题。
我希望这会对某人有所帮助。
为我修复的是将使用UIViewControllerTransitioningDelegate
协议的对象作为变量实例来保持与它的强关系。
我认为因为它在第一次呈现视图后被解雇了。
我遇到过同样的问题。
原来我需要在包含触发按钮的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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.