supportedInterfaceOrientations方法不适用于iOS 6 UIViewController

时间:2012-09-21 20:10:09

标签: uiviewcontroller orientation ios6

iOS 5 中,我的应用程序使用该方法更改了我的方向:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

iOS 6 中,我想我应该这样做,但它什么都不做!我的应用程序不是按照我想要的方式旋转。

- (BOOL) shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight;
}

6 个答案:

答案 0 :(得分:28)

这就是我添加viewController的方式。

我替换了这行代码:

[window addSubview:viewController.view];

这一行:

[window setRootViewController:viewController];

答案 1 :(得分:15)

当设备更改方向时,在iOS 6中,系统会询问应用程序支持的方向。应用程序将返回它接受的多个方向。

应用程序如何确定其方向?

  1. 首先,应用程序检查它的info.plist方向(这对于确定用于启动的方向非常重要。
  2. 其次它询问它的应用程序委托的方向,这可以通过-(NSUInteger)application:supportedInterfaceOrientationsForWindow:方法指定。这有效地覆盖了info.plist设置,这个实现是可选的。默认情况下,iPad应用程序可以向各个方向定位,而iPhone则可以完全颠倒。
  3. 最后,应用程序委托查询它的最顶层视图控制器,这可以是UINavigationControllerUIViewController ...等,然后它指定如何呈现以及是否要自动旋转。这些UIViewControllers可以使用shouldAutorotate:supportedInterfaceOrientations方法告诉应用代理如何呈现它。
  4. 您必须确保设置窗口的根视图控制器。

    此外,如果您要以全屏显示任何其他视图控制器,例如模态视图控制器,则负责确定方向更改。

答案 2 :(得分:2)

对我而言,解决方案有效,案例有所不同,因为我有一个UINavigationController。 我的情况是我需要除了一个以外的所有肖像窗口。我必须在目标中启用所有横向和纵向方向(否则它会在唯一的横向视图中崩溃)。

所以在这种情况下:

  1. UINavigationController创建一个子类,
  2. 在那里插入旋转特定的东西
  3. 并使用子类而不是UINavigationController

答案 3 :(得分:1)

如果您正在使用UINavigationController,它会将supportedInterfaceOrientations:消息发送到UINavigationController本身而不是最顶层的视图控制器(即您实际想要它做什么)。

您可以简单add a category to UINavigationController,而不必使用UINavigationController的子类来修复它。

答案 4 :(得分:0)

我在我的单例中创建了一个新变量:canRotate,当我希望viewcontroller支持某个方向时,我将其设置为YES。

在appDelegate中我添加了这个:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if([[SharedData sharedInstance] canRotate])
    {
        return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
    }
    return UIInterfaceOrientationMaskPortrait;
}

在我的情况下它有效。我有一个自定义tabbar和UINavigationviewControllers作为子视图添加到rootViewController。

答案 5 :(得分:0)

我知道这听起来非常简单,但是在我的iPhone上进行测试的过程中,我的大脑一直在弄清楚方向问题 - 我在纵向模式下进行了物理自动锁定模式 - 所以我没有改变编程方式 - 认为这应该是故障排除第1步!