切换子控制器
2019-03-09 本文已影响0人
Leon1024
- 因为切换过程需要个动画,要加个开关self.canChangeController控制动画完成后才能切换。后面成功的block会在动画animations完成后执行。
2.duration: 时长是 options: 转场动画的时长。如果为0,将会跳过动画。如果没有动画。因为 [self addChildViewController:newController];命令就会让自控制器进行加载,然后会到 viewDidLoad里面。 如果自控制器在加载后的一些列过程,在主线程加了耗时的UI操作,那么转场动画将会失败。无法正确调整子控制器的frame.
3.所以要注意,duration:不要为0,弄个很小的浮点数即可。而且在文档中,animations:的参数注明不能为空NULL. (貌似给个niu也没问题,还没发现)。
#pragma mark - 切换viewController
- (void)changeControllerFromOldController:(UIViewController *)oldController toNewController:(UIViewController *)newController
{
if (newController == oldController) {
return;
}
if (self.canChangeController) {
self.canChangeController = NO;
[self addChildViewController:newController];
[self transitionFromViewController:oldController toViewController:newController duration:0.01 options:UIViewAnimationOptionTransitionNone animations:^{} completion:^(BOOL finished) {
if (finished) {
//移除oldController,但在removeFromParentViewController:方法前不会调用willMoveToParentViewController:nil 方法,所以需要显示调用
[oldController willMoveToParentViewController:nil];
[oldController removeFromParentViewController];
newController.view.frame = self.childControllerParentView.bounds;
self.currentVC = newController;
}else{
self.currentVC = oldController;
}
self.canChangeController = YES;
}];
}
}