transitionFromViewController 返回NO

1,325 阅读1分钟
transitionFromViewController 方法 

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);

交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)

fromViewController:当前显示的子试图控制器,将被替换为非显示状态 

toViewController:将要显示的子视图控制器 

duration:交换动画持续的时间,单位秒 

options:动画的方式 

animations:动画Block 

completion:完成后执行的Block

 切换子视图控制器

- (void)viewCotrollerChange:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == _selectedIndex) {
        return;
    }
    _selectedIndex = sender.selectedSegmentIndex;
    if (sender.selectedSegmentIndex == 0) {
        [self changeToNormalImageView];
    }else if (sender.selectedSegmentIndex == 1) {
        [self changeToVRImageView];
    }else if (sender.selectedSegmentIndex == 2) {
        [self changeToVideView];
    }
}


- (void)changeToNormalImageView {
    [self addChildViewController:self.normalImageVC];
    UIViewController *oldViewController = _currentViewController;
    [self transitionFromViewController:_currentViewController toViewController:self.normalImageVC duration:0.5 options:UIViewAnimationOptionTransitionNone animations:^{
    } completion:^(BOOL finished) {
        if (finished) {
            [_normalImageVC didMoveToParentViewController:self];
            [_currentViewController willMoveToParentViewController:nil];
            [_currentViewController removeFromParentViewController];
            _currentViewController = self.normalImageVC;
        }else {
            _currentViewController = oldViewController;
        }
    }];
}

在写的过程中出现过一个很奇怪的问题,切换到normalImageView的时候,transitionFromViewController的completion的回调 finished一直为NO;导致子视图控制器的切换失败。

经过多次调试后发现,normalImageVC的viewWillAppear里有个刷新,每次切换到该子视图控制器的时候都会刷新,导致切换失败。增加duration的动画时间效果不明显,因为用户可以疯狂的点击Segment进行切换。 最终通过修改normalImageVC的viewWillAppear方法,不让他刷新,解决了这个问题,这里做一个简单的记录。