首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用transitionFromViewController:toViewController:duration:options:animations:completion:

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

Stack Overflow用户
提问于 2011-12-10 01:22:59
回答 1查看 31.1K关注 0票数 33

关于如何正确使用transitionFromViewController:toViewController:duration:options:animations:completion:,我似乎找不到一个很好的例子。

这是正确的吗?(假设我想与另一个人交换一个VC )

代码语言:javascript
复制
// 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:方法。容器视图控制器类必须在转换到新的子视图控制器之后调用子视图控制器的didMoveToParentViewController:,如果没有转换,则必须在调用addChildViewController:方法之后立即调用。 同样,容器视图控制器有责任在调用willMoveToParentViewController:方法之前调用removeFromParentViewController:方法。removeFromParentViewController:方法调用子视图控制器的didMoveToParentViewController:方法。

另一件事是,在这种情况下,如何使用动画块?注意,在上面的代码中,我刚刚将NULL放在这里。(我对块体本身很熟悉,只是不知道到底该把什么写进去)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-10 01:29:13

在过去,我也实现过类似的事情。但是,我会将-willMoveToParentViewController:移出完成块,因为应该在视图控制器被移动之前通知它(也就是说,当完成块运行时,fromVC已经将其父VC设置为nil )。总之,类似这样的事情:

代码语言:javascript
复制
[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。如果您没有想要动画的视图属性,那么您可以简单地传递一个空块^{}。基本上,此参数用于在过渡期间动画视图层次结构中视图的属性。可动画属性列表可以在UIView文档中的“动画”标题下找到。例如,假设您不希望fromVC处理的整个视图交叉溶解,而只希望其视图层次结构中有一个名为subview1的子视图淡出。您可以使用动画块来完成此操作:

代码语言:javascript
复制
[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];
                                   }];
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8453653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档