我有一个 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/