gpt4 book ai didi

ios - 使用 [UIViewControllerTransitionCoordinator animateAlongsideTransition :completion:] in a modal presentation, 时,不会调用动画 block

转载 作者:可可西里 更新时间:2023-11-01 17:16:27 43 4
gpt4 key购买 nike

我有一个 UIViewController,它通过 Storyboard中的模态转场呈现(嵌入在 UINavigationController 中)。我正在尝试将键盘外观与模态演示一起制作动画(这的逻辑超出了问题的范围)。

我在 viewWillAppear: 中使用 [self.transitionCoordinator animateAlongsideTransition:completion:] 来执行此操作,但我注意到从未调用动画 block .所以一些日志让我看到唯一一次新创建模态视图 Controller 上调用动画 block 是在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

此 Controller 的模态表示输出为:

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: 中没有调用动画 block ,更恼人的是 viewDidLoad: 中的动画 block 在 之前被调用code>viewWillAppear: 被调用了。

谁能帮我得到动画 block viewWillAppear: 被调用?

请注意,当我将另一个 View Controller 推到导航 Controller 上并返回时,将调用 viewWillAppear: 中的动画 block 。

我做了一个Sample Project如果有帮助。

更新

已归档为 rdar://20171073

最佳答案

您正在呈现一个 UINavigationController。您可以通过子类化 UINavigationController 并覆盖 -viewWillAppear: 来为该演示文稿制作动画。但是,此时导航 Controller 尚未将其 Root View Controller 添加到 View 层次结构中,因此您设置的任何动画都将不起作用。

@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 设置其 View 层次结构:

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

这还负责在 Root View Controller 上调用 -viewWillAppear:,使您可以使用模态呈现进行动画处理。

通过这个 hack,我可以在模态演示的同时制作动画。它很难看,我不会使用它,但它至少可以让你测试你的键盘动画方法是否有任何优点。

根据您实际想要完成的目标,您可能更幸运地使用 UIPresentationController 创建自定义模式演示。

关于ios - 使用 [UIViewControllerTransitionCoordinator animateAlongsideTransition :completion:] in a modal presentation, 时,不会调用动画 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017047/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com