animationUISplitViewController的主细节控制器的可见性

在我的UISplitViewController中,我希望主视图控制器只允许在纵向方向或当我的详细信息视图控制器不显示控制器typesMyFullScreenViewController 。 我已经实现了UISplitViewControllerDelegate以适当地指出这一点。

 -(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation { if (UIInterfaceOrientationIsPortrait(orientation) || [[self.navigationController topViewController] isKindOfClass:[MyFullScreenViewController class]]) { return YES; } return NO; } 

但是,UISplitViewController仅在旋转期间调用委托。 所以MyFullScreenViewController实现了一个viewWillAppear:animatedviewWillDisappear:animated

 - (void)viewWillAppear:(BOOL)animated { [self fakeRotationOfSplitViewController]; [super viewWillAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { [self fakeRotationOfSplitViewController]; [super viewWillDisappear:animated]; } -(void)fakeRotationOfSplitViewController { UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; CGFloat duration = 1.0f; CGFloat fakeDuration = 0.0f; [UIView animateWithDuration:duration delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{ [[self splitViewController] willAnimateRotationToInterfaceOrientation:orientation duration:fakeDuration]; [[self splitViewController] willRotateToInterfaceOrientation:orientation duration:fakeDuration]; [[self splitViewController] didRotateFromInterfaceOrientation:orientation]; } completion:^(BOOL finished) { }]; } 

除了animation以外,一切都是有效 主视图控制器立即消失并在UINavigationController对象的推送之前和popupanimation之前重新出现。

该文档不清楚willRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:应该在animation块中调用,但我怀疑他们不应该允许视图控制器animation它的响应消息的变化。 但是,如果它们落在animation块之外,则主视图控制器有时会消失。

animation不工作,因为在didRotateFromInterfaceOrientation:之后,我从来没有调用过viewWillLayoutSubviews

 [UIView animateWithDuration:duration delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{ [[self splitViewController] willAnimateRotationToInterfaceOrientation:orientation duration:fakeDuration]; [[self splitViewController] willRotateToInterfaceOrientation:orientation duration:fakeDuration]; [[self splitViewController] didRotateFromInterfaceOrientation:orientation]; [[self splitViewController] viewWillLayoutSubviews]; [[[self splitViewController] view] layoutSubviews]; } completion:^(BOOL finished) { }];