切换子控制器

  1. 因为切换过程需要个动画,要加个开关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;
        }];
    }
}

你可能感兴趣的:(切换子控制器)