iOS 6:旋转后忽略父模态的modalPresentationStyle

使用iOS6的iPad,我们有一个模式视图控制器将扩展到全屏的错误,即使它被告知使用“表单”演示文稿样式。 但是,这只有在有两个模态,一个父模态和一个子模态时才会发生。

所以这是如何创build和呈现第一个模式:

UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; [parentController presentModalViewController:navigationController animated:YES]; // parentController is my application's root controller 

这是如何创build和呈现孩子模态:

 UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; [parentController presentModalViewController:navigationController animated:YES]; // parentController is the navigationController from above 

所以当从横向旋转到纵向时,即使我们旋转回风景,父模式也会扩展到全屏模式。

当我们拥有父模态本身(没有子模态)时,它就像预期的那样工作,这就是它仍然是表单样式。

请注意,这仅在iOS6(设备和模拟器)上发生,并且不会在iOS 5(模拟器上发生并由testing人员报告工作)发生。

到目前为止,我已经尝试了以下成功:

  • wantsFullScreenLayout设置为NO
  • 强制wantsFullScreenLayout总是通过覆盖它返回NO
  • 确定我的控制器内的导航控制器也指定UIModalPresentationFormSheet
  • 实现preferredInterfaceOrientationForPresentation
  • 升级到iOS 6.0.1

谢谢!


更新 :所以,我调整了来自苹果开发者论坛( https://devforums.apple.com/message/748486#748486 )的响应,以便它可以与多个嵌套模式一起使用。

 - (BOOL) needNestedModalHack { return [UIDevice currentDevice].systemVersion.floatValue >= 6; } - (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { // We are the top modal, make to sure that parent modals use our size if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { for (UIViewController* parent = self.presentingViewController; parent.presentingViewController; parent = parent.presentingViewController) { parent.view.superview.frame = parent.presentedViewController.view.superview.frame; } } [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; } - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { // We are the top modal, make to sure that parent modals are hidden during transition if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { for (UIViewController* parent = self.presentingViewController; parent.presentingViewController; parent = parent.presentingViewController) { parent.view.superview.hidden = YES; } } [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; } - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { // We are the top modal, make to sure that parent modals are shown after animation if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { for (UIViewController* parent = self.presentingViewController; parent.presentingViewController; parent = parent.presentingViewController) { parent.view.superview.hidden = NO; } } [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; } 

不知道这是否应该被视为一个错误,我很好奇iOS 7会带来什么,但是目前这个问题的解决方法是将modalPresentationStyle设置为UIModalPresentationCurrentContext为child-viewController。

 Set modalPresentationStyle = UIModalPresentationCurrentContext 

这使得孩子仍然以FormSheet的forms呈现,但却阻止了父母在旋转的时候将其调整为全屏。

短剑

我可以在这里看到2个问题。

1)在iOS 6中, presentModalViewController:animated:方法已被废弃,尝试使用presentViewController:animated:completion:尽pipe这可能没有帮助,但仍然可能需要这样做)

2)在iOS 6中,似乎容器控制器(例如UINavigationController )不会将自动旋转消息重新发送给他们的孩子。 尝试子类化UINavigationController并重新定义相应的自动旋转方法发送给所有的孩子。 这可能有帮助。

您需要在主视图后立即安装导航控制器。 这样你就可以在每个视图中pipe理旋转。

如果您的AppDelegate RootViewController是一个导航控制器,您将无法使用本机function来pipe理旋转。