正确使用transitionFromViewController:toViewController:duration:options:animations:completion:

时间:2011-12-10 01:23:00

标签: iphone objective-c ios ipad

我似乎找不到如何正确使用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。 (我对块本身很熟悉,我只是不确定在这个版本中应该放什么)

1 个答案:

答案 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];
                                   }];