如何将我的应用限制为横向模式?

nac*_*o4d 13 iphone cocoa-touch landscape orientation ipad

我使用SplitView模板创建了我的iPad应用程序.我想知道将我的应用程序限制为横向模式的最佳方法是什么?

我试过shouldAutorotateToInterfaceOrientation:在DetailViewController.m中重写 方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
Run Code Online (Sandbox Code Playgroud)

但是4.2 GM仍然是有缺陷的,它无法显示控制器视图.我还有其他选择吗?

提前致谢.

UPDATE1

  • 我已经提交了错误报告: 错误ID#8620135

  • 我的应用程序几乎已经完成,我必须找到一个工作周期,因为我认为他们不会在4.2正式发布之前解决这个问题(GM已经出局!)

    为了重新创建bug,只需在任何UIViewControllers(RootViewController或DetailViewControllers)中使用SplitView模板并覆盖上面的方法

UPDATE2

我找到了解决办法.(有关完整的解决方法,请参阅UPDATE3)

设置UISupportedInterfaceOrientations仅支持横向,这将强制应用程序以横向模式启动,允许DetailViewController正确启动(因此显示正确)

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)

但是如果你旋转设备,它会变成肖像模式!!!,所以仍然需要覆盖 shouldAutorotateToIntercafeOrientation:如上所述

讨论:

如果这不是一个错误,我会期望在视图控制器不支持的方向启动应用程序时出现警告或执行错误,异常或其他问题.此外,为什么只有DetailViewController不显示?如果这是规范,那么RootViewController也应该无法加载.你不觉得吗?谢谢你的帮助...;)

UPDATE3

经过进一步测试后,我意识到上述解决办法在某些情况下不起作用.例如,当设备处于横向状态时启动应用程序将无法正常工作!真正的问题似乎是在iOS4.2GM中,UISplitViewController需要其所有控制器在其加载时具有所有旋转.因此有必要欺骗他,以便在横向模式下加载,然后不允许他旋转其视图控制器.

所以这是烦人的iBug的新解决方案.

第1步:像这样设置Info.plist:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)

Step2在DetailViewController.m或.h中设置一个新标志(来自SplitView模板)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //WORK-ARROUND: Bug ID# 8620135.
    if (lockRotation) {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }else{
        return YES;
    }
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
}
- (void)viewDidAppear:(BOOL)animated {
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135.
    [super viewDidAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)

重要说明: 请注意,此错误仅在加载UISplitViewController时出现,而不是每次出现其视图时都会出现.因此,要查看此错误,请确保应用程序之前已终止.

Jon*_*an. 2

我问了一个悬赏500的问题,这似乎和你面临的问题是一样的

根据我有限的经验,制作仅横向的 iPhone 应用程序比仅横向的 iPad 应用程序要容易得多。我不确定为什么会有任何差异,但苹果公司所说的使其仅横向显示的步骤本身并不起作用。