繁体   English   中英

iOS 9自定义转换 - 未调用animationControllerForDismissedController

[英]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 iOS 8

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

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

我遇到了同样的问题。

我希望这会对某人有所帮助。

为我修复的是将使用UIViewControllerTransitioningDelegate协议的对象作为变量实例来保持与它的强关系。

我认为因为它在第一次呈现视图后被解雇了。

我遇到过同样的问题。

原来我需要在包含触发按钮的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM