3

我是 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 的错误。任何解释或解决方案将不胜感激!

4

3 回答 3

10

我遇到了同样的问题。

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

为我解决的问题是将应用UIViewControllerTransitioningDelegate协议的对象作为变量实例来保持与它的牢固关系。

我认为是因为在第一次呈现视图后它被忽略了。

于 2016-02-07T17:06:32.920 回答
4

我遇到过同样的问题。

原来我需要在包含触发按钮navigationController的那个上设置委托。UIViewController

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

UIViewController *dvc = [self sourceViewController];
TransitionDelegate *transitionDelegate = [TransitionDelegate new];

dvc.modalPresentationStyle = UIModalPresentationCustom;
dvc.transitioningDelegate = transitionDelegate;

[dvc dismissViewControllerAnimated:YES completion:nil];

我将第一行更改为:

UIViewController *dvc = [self sourceViewController].navigationController;

它奏效了。

希望这可以帮助。

于 2016-04-20T15:30:48.497 回答
0

你需要这样说:

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

或者,如果您使用的是 segue,请在 prepareForSegue 中说:

MyDestinationViewController *toVC = segue.destinationViewController;
MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init];
toVC.transitioningDelegate = transitioningDelegate;
于 2015-12-16T03:08:49.500 回答