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

我似乎无法find如何使用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:方法。 在转换到新子进程之后,容器视图控制器类必须调用子视图控制器的didMoveToParentViewController:或在调用addChildViewController:方法后立即调用子视图控制器(如果没有转换)。

同样,在调用removeFromParentViewController:方法之前,容器视图控制器的职责是调用willMoveToParentViewController 方法。 removeFromParentViewController:方法调用子视图控制器的didMoveToParentViewController:方法。

另一件事是,在这种情况下,你如何使用animation块? 注意上面的代码我只是把NULL 。 (我本身对块本身很熟悉,我只是不确定要在这个块中放什么)

我过去也是这样做的。 但是,我会移动-willMoveToParentViewController:在完成块之外,因为视图控制器在移动之前应该被通知(即,在完成块运行时,VC已经将其父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]; }]; 

在animation方面,根据方法文档,您不应将此参数设置为NULL 。 如果你没有视图属性你想要animation,那么你可以简单地传递一个空块^{} 。 基本上这个参数用于在转换过程中为视图层次结构中的视图的animation属性。 animation属性列表可以在UIView文档的“animation”标题下find。 举一个例子,假设你不希望你的整个视图由fromVC处理交叉解散,而只需要一个名为subview1视图层次中的一个子视图淡出。 你可以使用animation块来做到这一点:

 [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]; }];