UiSplitViewController 不会自动旋转

Posted

技术标签:

【中文标题】UiSplitViewController 不会自动旋转【英文标题】:UiSplitViewController doesn't autorotate 【发布时间】:2010-04-29 00:21:35 【问题描述】:

我最近遇到了一个问题。我的 iPad 应用程序以某种方式阻止了 iPad 自动旋转。我的应用程序加载了一个 UISplitView,两个视图控制器都为 shouldAutorotateToInterfaceOrientation: 返回 YES。我已经设置了我的 info.plist 以包含所有四个方向的“支持的界面方向”键。但是,当我运行应用程序时,旋转设备不会旋转 splitView(即使我收到 UIDeviceOrientationDidChangeNotification)。此外,当我以不同的方向退出我的应用程序时,它在 iPad 主屏幕中启动时不会自动旋转到正确的视图,直到我再次旋转它而不运行我的应用程序......任何想法将不胜感激...... .

【问题讨论】:

【参考方案1】:

UISplitViewController 是我用过的最喜怒无常的视图控制器子类之一。为了让它“完美地”工作,它必须在您的应用程序窗口中作为单个根视图存在。然而,你可以通过一些技巧来解决这个问题——在我的例子中,我需要一个 UITabBarController 至少有两个不同的 UISplitViewControllers 作为视图控制器——但是你必须处理涉及旋转和UISplitViewControllerDelegate 回调未触发。

希望 Apple 在未来让 UISplitViewController 与其他 UIKit 组件更加兼容...

【讨论】:

你可以用你说的诡计绕过它......什么诡计?你取笑! 它归结为只是手动转发适当的轮换方法。记录一堆东西,看看是什么方法,我们没有被调用。然后我只是在我的根视图控制器子类中进行补偿,确保子视图控制器触发了正确的方法,调整了它们的视图大小等。 我现在遇到了同样的问题,我的 SplitViewController 是 TabBarController 下的选项卡,行为不稳定,所以很高兴知道这不仅仅是我!至少感谢您的安慰!【参考方案2】:

我在使用两个从属 UINavigationController 时遇到了同样的问题。在我的情况下,一旦我在左侧控制器中覆盖 shouldAutorotateToInterfaceOrientation: 以始终返回“YES”,旋转就会开始工作。

【讨论】:

masterView 和 detailView 都需要支持 YES 用于您尝试旋转到的任何方向。如果其中任何一个不返回 YES,它就不会旋转。我错过了这个微妙的细节,我的 masterView 只支持肖像。希望这对其他人有帮助。【参考方案3】:

我发现这可以正常工作 - 只要 UISplitViewController 的两个孩子都实现 shouldAutorotateToInterfaceOrientation

即如果你有类似的东西:

        MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil];
        UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

        DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
        UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];

        self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController];

       self.window.rootViewController = self.splitViewController;

定义rootViewControllerNSApplication 那么MasterViewControllerDetailViewController 都应该实现:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    return YES;

以确保轮换有效。

【讨论】:

【参考方案4】:

您的 UISplitViewController 是否设置为您的根视图控制器?如果不是,那可能是您的问题的原因。我遇到了类似的问题 - 状态栏会旋转,但我的详细信息和主视图会保持不变。我重新排列了视图,使 UISplitViewController 成为根,然后我的“主菜单”作为模式视图控制器呈现在拆分视图的顶部,它使旋转问题消失了。

根据iPad Programming Guide,“拆分视图控制器的视图应始终安装为应用程序窗口的根视图。”

希望这会有所帮助。

【讨论】:

【参考方案5】:

我现在遇到了同样的问题。原因是除了 UISplitViewController 的视图之外,我不小心在窗口中添加了 另一个 视图。删除额外的视图使其工作。

【讨论】:

【参考方案6】:

您说您的第一个问题是 UISplitView 阻止您自动旋转。尝试使用 Splitview 的子类,而不是启用自动旋转:

@implementation SplitViewControllerRotating
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    NSLog(@"SplitViewControllerRotating shouldAutorotate");
    return YES;

@end

你的第二个问题听起来很奇怪。你说退出你的应用程序后你必须旋转,以便你的 iPad 识别界面方向。帮不了你。

【讨论】:

我试了一下...没用... UISplitView 的目的不就是自动旋转吗? 有人知道ios 9 的解决方案吗?上面回答的答案已被弃用。

以上是关于UiSplitViewController 不会自动旋转的主要内容,如果未能解决你的问题,请参考以下文章

UiSplitViewController 不会自动旋转

UISplitViewController 不会显示模态视图控制器

UISplitViewController - 主弹出框 - 肖像模式:如何自定义/删除最顶层的边框?

具有不是 UITableViewController 的自定义主视图控制器的 UISplitViewController

UISplitViewController 上带有 UIVisualEffectView 的 UIPopoverController - iPhone 6 plus 上的背景不会变得模糊

带有自定义 selectedBackgroundView 的 UITableViewCell,它比 UISplitViewController 上的主视图控制器更宽