我似乎找不到如何正确使用transitionFromViewController:toViewController:duration:options:animations:completion:
的好例子。
这是对的吗? (假设我想将VC换成另一个)
// Assume fromVC and toVC view controllers are defined and fromVC is already added as a child view controller
[self addChildViewController:toVC];
[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:NULL completion:^(BOOL finished) {
[fromVC willMoveToParentViewController:nil];
[fromVC removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
关于何时调用以下内容的文档并不清楚:
addChildViewController:方法调用 视图控制器的 willMoveToParentViewController:方法 在添加之前添加为孩子,但它不会调用 didMoveToParentViewController:方法。容器视图控制器 class必须调用子视图的 didMoveToParentViewController: 过渡到新孩子的控制器完成后,如果 呼叫后立即没有过渡 addChildViewController:方法。
同样,它是容器视图控制器的责任 在调用之前调用 willMoveToParentViewController:方法 removeFromParentViewController:方法。该 removeFromParentViewController:方法调用 子视图控制器的 didMoveToParentViewController:方法。
另一件事是,在这种情况下你如何使用动画块?请注意,在上面的代码中我只放了NULL
。 (我对块本身很熟悉,我只是不确定在这个版本中应该放什么)
答案 0 :(得分:59)
我过去也曾这样做过类似的事情。但是,我会将-willMoveToParentViewController:
移到完成块之外,因为该视图控制器应该在移动之前得到通知(即,在完成块运行时,fromVC
已将其父VC设置为nil
。总而言之,就像这样:
[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];
[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{} completion:^(BOOL finished) {
[fromVC removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
就动画而言,根据方法文档,您不应将此参数设置为NULL
。如果您没有要设置动画的视图属性,则只需将其传递给空块^{}
即可。基本上,此参数用于在转换期间为视图层次结构中的视图的属性设置动画。可以在“动画”标题下的the UIView documentation中找到可设置动画的属性列表。例如,假设您不希望fromVC
处理的整个视图交叉消解,而只希望其视图层次结构中名为subview1
的一个子视图淡出。您可以使用动画块执行此操作:
[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];
[self transitionFromViewController:fromVC
toViewController:toVC
duration:0.3
options:UIViewAnimationOptionTransitionNone
animations:^{
[subview1 setAlpha:0.0];
}
completion:^(BOOL finished) {
[fromVC removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];