繁体   English   中英

在模式演示中使用[UIViewControllerTransitionCoordinator animateAlongsideTransition:completion:]时,不调用动画块

[英]When using [UIViewControllerTransitionCoordinator animateAlongsideTransition:completion:] in a modal presentation, the animation block is not called

我有一个UIViewController ,通过故事板中的模态segue(嵌入在UINavigationController )呈现。 我试图在模态演示文稿旁边设置键盘外观的动画(这个逻辑超出了问题的范围)。

我在viewWillAppear:使用[self.transitionCoordinator animateAlongsideTransition:completion:] viewWillAppear:要做到这一点,但我注意到动画块永远不会被调用。 因此,一些日志记录让我看到在新创建的模态视图控制器上调用动画块的唯一时间是在viewDidLoad:期间viewDidLoad:

@implementation MyModalViewController

- (void)viewDidLoad {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [super viewDidLoad];

    [self.transitionCoordinator animateAlongsideTransition:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s ANIMATION", __PRETTY_FUNCTION__);
    } completion:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s COMPLETION", __PRETTY_FUNCTION__);
    }];
}

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [super viewWillAppear:animated];

    [self.transitionCoordinator animateAlongsideTransition:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s ANIMATION", __PRETTY_FUNCTION__);
    } completion:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s COMPLETION", __PRETTY_FUNCTION__);
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [super viewWillDisappear:animated];

    [self.transitionCoordinator animateAlongsideTransition:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s ANIMATION", __PRETTY_FUNCTION__);
    } completion:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSLog(@"%s COMPLETION", __PRETTY_FUNCTION__);
    }];
}

@end

该控制器的模态表示的输出是:

SampleAnimatedTransition[43690:1768171] -[MyModalViewController viewDidLoad]
SampleAnimatedTransition[43690:1768171] __36-[MyModalViewController viewDidLoad]_block_invoke ANIMATION
SampleAnimatedTransition[43690:1768171] -[MyModalViewController viewWillAppear:]
SampleAnimatedTransition[43690:1768171] __36-[MyModalViewController viewDidLoad]_block_invoke_2 COMPLETION
SampleAnimatedTransition[43690:1768171] __40-[MyModalViewController viewWillAppear:]_block_invoke_2 COMPLETION

但在解雇期间,输出是:

SampleAnimatedTransition[43690:1768171] -[MyModalViewController viewWillDisappear:]
SampleAnimatedTransition[43690:1768171] __43-[MyModalViewController viewWillDisappear:]_block_invoke ANIMATION
SampleAnimatedTransition[43690:1768171] __43-[MyModalViewController viewWillDisappear:]_block_invoke_2 COMPLETION

注意在viewWillAppear:是如何调用动画块的,更令人讨厌的是,在调用viewWillAppear:之前调用viewDidLoad:的动画块。

任何人都可以帮助我获取动画块是viewWillAppear:被调用?

需要注意的是,当我把另一个视图控制器到导航控制器和回击,在动画块viewWillAppear: 调用。

如果它有帮助,我做了一个示例项目

更新

这已被提交为rdar:// 20171073

你正在展示一个UINavigationController 您可以通过-viewWillAppear: UINavigationController并覆盖-viewWillAppear:来使用该演示文稿进行动画处理-viewWillAppear: 但是,此时导航控制器尚未将其根视图控制器添加到视图层次结构中,因此您设置的任何动画都不起作用。

@implementation MyNavigationController
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.transitionCoordinator animateAlongsideTransition:^ (id <UIViewControllerTransitionCoordinatorContext> context) {
        NSAssert([self.viewControllers[0] superview] != nil, @""); // Fails
    } completion:nil];
}
@end

事实证明,您可以使用layoutIfNecessary强制UINavigationController设置其视图层次结构:

@implemenation MyNavigationController
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.view layoutIfNeeded];
}
@end

这也需要在根视图控制器上调用-viewWillAppear:允许您使用模态演示进行动画处理。

有了这个黑客,我就能够在模态演示中进行动画制作。 这很难看,我不会用它,但它至少可以让你测试你的键盘动画方法是否有任何优点。

根据您实际想要完成的任务,您可以更幸运地使用UIPresentationController创建自定义模式演示文稿。

暂无
暂无

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

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