现在,这个问题部分地被问了很多,但没有人真正考虑如何(或何时)发送消息-viewWillDisappear
& -viewDidDisappear
。几乎每个示例都使用以下设计:
[UIView animateWithDuration:0.5
delay:1.0
options: UIViewAnimationCurveEaseOut
animations:^{
yourView.alpha = 0;
}completion:^(BOOL finished){
[yourView removeFromSuperview]; // Called on complete
}];
这样做的问题是这些消息都将在动画结束时发送!现在,-addSubview
可以进行动画处理(如果放在动画块内),它将以正确的时间差发送相应的消息( -viewWillAppear
& )。-viewDidAppear
所以自然会放在-removeFromSuperview
动画块内。这将正确发送消息,但实际上视图会立即被删除,从而制作动画......好吧,它不会动画,因为没有任何东西可以动画!
这是苹果故意的吗?如果是这样,为什么?你如何正确地做到这一点?
谢谢!
编辑。
只是为了澄清我在做什么:我有一个自定义的 segue,从顶部垂直动画一个 Child-ViewController ,它可以使用以下代码按预期工作:
-(void)perform{
UIViewController *srcVC = (UIViewController *) self.sourceViewController;
UIViewController *destVC = (UIViewController *) self.destinationViewController;
destVC.view.transform = CGAffineTransformMakeTranslation(0.0f, -destVC.view.frame.size.height);
[srcVC addChildViewController:destVC];
[UIView animateWithDuration:0.5f
animations:^{
destVC.view.transform = CGAffineTransformMakeTranslation(0.0f, 0.0f);
[srcVC.view addSubview:destVC.view];
}
completion:^(BOOL finished){
[destVC didMoveToParentViewController:srcVC];
}];
}
在这里它将按以下顺序发生(感谢-addSubview
在动画块内):
- 添加 childView(将自动调用
-willMoveToParentViewController
) -addSubview
将调用-viewWillAppear
- 当动画结束时,
-addSubview
将调用-viewDidAppear
-didMoveToParentViewController
在完成块内手动调用
上面是确切的预期行为(就像内置的转换行为一样)。
使用以下代码执行上述 segue 但向后(使用 unwindSegue):
-(void)perform{
UIViewController *srcVC = (UIViewController *) self.sourceViewController;
srcVC.view.transform = CGAffineTransformMakeTranslation(0.0f, 0.0f);
[srcVC willMoveToParentViewController:nil];
[UIView animateWithDuration:5.5f
animations:^{
srcVC.view.transform = CGAffineTransformMakeTranslation(0.0f, -srcVC.view.frame.size.height);
}
completion:^(BOOL finished){
[srcVC.view removeFromSuperview]; // This can be done inside the animations-block, but will actually remove the view at the same time ´-viewWillDisappear´ is invoked, making no sense!
[srcVC removeFromParentViewController];
}];
}
流程将是这样的:
- 手动调用
-willMoveToParentView:nil
通知将被移除 - 当动画结束时,两个
-viewWillDisappear
&-viewDidDisappear
会同时被调用(错误!)并且-removeFromParentViewController
会自动调用-didMoveToParentViewController:nil
.
如果我现在进入-removeFromSuperview
动画块,事件将被正确发送,但是当动画开始而不是动画结束时视图被删除(这是没有意义的部分,遵循-addSubview
行为方式)。