关闭模式对话框时 iPad UISplitViewController 不必要地旋转

Posted

技术标签:

【中文标题】关闭模式对话框时 iPad UISplitViewController 不必要地旋转【英文标题】:iPad UISplitViewController rotates unnecessarily when modal dialog is closed 【发布时间】:2010-10-21 16:25:31 【问题描述】:

我有一个相当简单的拆分视图应用程序,它改编自 iPhone 代码。主要功能是在与 iPhone 和 iPad 特定类继承和扩充代码的共享类中。 iPad 应用程序中使用的所有类都有以下内容:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation // 重写以允许任何方向。 返回是;

主视图控制器由 UIToolbar 和 UITableView 组成。在每个阶段小节 2 处正确响应旋转。如果我从这个视图显示一个模态对话框:

navigationController = [[UINavigationController alloc] initWithRootViewController:tvc]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; [self presentModalViewController:navigationController Animation:NO];

一切都按预期工作,包括旋转设备,直到我以任何方式关闭对话框:

[自我dismissModalViewControllerAnimated:是];

此时我的主视图旋转了 90 度。我查看了 nib 文件中的设置,一切似乎都很好。有什么建议吗?左侧 UITableView 呈现的模态对话框不存在此问题。

额外问题:

我发现左侧视图显示的模态对话框确实存在故障。但只有一个。如果它在纵向模式下由弹出视图呈现并且设备被旋转,你会得到一个相当令人印象深刻的图形故障,因为它永远旋转出视图!

【问题讨论】:

我快速打开的拆分视图应用程序的外壳没有显示问题,所以我会比较和对比,找到解决方案后会发回。 设置断点和单步执行表明当模态视图控制器出现时,每个显示的视图都会调用 shouldAutorotatetoInterfaceOrientation。当视图没有旋转时,这看起来非常奇怪。 注意 - 上面提到的“奇怪”行为似乎是正常的。我仍然认为这很奇怪;为什么在设备不旋转时会进行这些调用?我的应用程序的布局是主显示窗口由一个 xib 组成,其中包含一个 UIView(带有 UIToolbar 和 UITableView)和一个 UITableViewController。这一切都通过IB正常链接。我在其他地方读到,在视图控制器中包含视图控制器是一个非常愚蠢的想法,所以我将把代码合并为一个。有一个历史原因它是分开的,但它本质上是:简单 + 懒惰。 【参考方案1】:

如上面评论中所述,我设法将两个视图控制器合并为一个,将处理工具栏 + 拆分视图控制器的代码合并到 iPad 版本中。原来有一个继承自 UITableViewController 的通用类,iPad 和 iPhone 版本的代码都继承自这个通用类。 问题出在 iPad 上,我希望顶部有一个工具栏,并且还必须支持 splitview 控制器。这是有问题的,因为该类是 UITableViewController,所以我创建了一个包含工具栏和 tableview 控制器以及 splitview 代码的父类。 在重构中,我将通用类更改为 UIViewController 并进行更改以支持代码中的 UITableView,这与几本 iPhone 开发书籍中的常规和说明一样。在 iPhone 版本的类中,我使用必要的方法手动创建 UITableView。在 iPad 版本中,它来自一个 xib 文件。 这示意性地简化了事情,因为现在主视图在控制器中没有控制器。它也解决了这个问题。关闭模式对话框时 UI 旋转 90 度不再出现。

【讨论】:

以上是关于关闭模式对话框时 iPad UISplitViewController 不必要地旋转的主要内容,如果未能解决你的问题,请参考以下文章

iPad 上的 UISplitView - 我有正确的结构吗?

iPad拆分视图,uisplitview中的多个主视图和详细视图

以编程方式隐藏UISplitview的masterDetailview

在基于 UISplitView 的 iPad 应用程序底部添加工具栏

UISplitView,在设置代表时接收语义问题

通用应用程序的 iPad UISplitView 问题