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

时间:2012-11-12 16:55:13

标签: ios ipad rotation modal-dialog

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

这就是第一个模态的创建和呈现方式:

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

这就是如何创建和呈现子模态:

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

因此,当从横向旋转到纵向时,即使我们旋转回横向,父模式也会扩展到全屏并保持这种状态。

当我们拥有父模态本身(没有子模态)时,它按预期工作,即它保持表单样式。

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

到目前为止,我已尝试以下方法但没有成功:

  • wantsFullScreenLayout设为NO
  • 强制wantsFullScreenLayout始终通过覆盖NO来返回
  • 确定导航控制器内的控制器还指定UIModalPresentationFormSheet
  • 实施preferredInterfaceOrientationForPresentation
  • 升级到iOS 6.0.1

谢谢!


更新: 所以,我调整了Apple Developer Forums(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];
}

3 个答案:

答案 0 :(得分:7)

不确定这是否应该被视为一个错误,我很好奇iOS 7将带来什​​么,但目前解决此问题的方法是将modalPresentationStyle设置为子视图控制器的UIModalPresentationCurrentContext。

Set modalPresentationStyle = UIModalPresentationCurrentContext

这使得孩子仍然可以作为FormSheet呈现,但可以防止父母在轮换时调整大小到全屏。

德克

答案 1 :(得分:0)

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

1)在iOS 6中,方法presentModalViewController:animated:已弃用,请尝试使用presentViewController:animated:completion: (尽管这可能没有帮助,但你仍然可能想要这样做)

2)在iOS 6中,某种程度上出现了容器控制器(例如UINavigationController)不会向自己的孩子重新发送自动转发消息。尝试对UINavigationController进行子类化,并重新定义要发送给所有子项的相应自动旋转方法。这可能有所帮助。

答案 2 :(得分:-1)

您需要在主视图后实现导航控制器。 这样您就可以在每个视图中管理旋转。

如果您的AppDelegate RootViewController是导航控制器,您将无法使用本机功能管理旋转。