99

请注意,这个问题来自 2008 年,现在仅具有历史意义。


无论设备的位置如何,创建从一开始就以横向模式运行的 iPhone 应用程序的最佳方法是什么?

以编程方式和使用 Interface Builder。

4

8 回答 8

47

仅历史性答案。过时了。

请注意,这个答案现在已经非常过时了/

这个答案只是历史的好奇


令人振奋的消息!正如下面 Andrew 所发现的,Apple 已在 4.0+ 中修复了此问题。

看起来不再需要在每个视图上强制视图的大小,并且景观“仅在第一次工作”的具体严重问题已经解决。

截至 2011 年 4 月,无法测试甚至构建低于 4.0 的任何东西,所以这个问题纯粹是历史上的好奇。这么长时间给开发者带来了多大的麻烦,真是不可思议!


这是原始的讨论和解决方案。现在这完全无关紧要,因为这些系统甚至无法运行。


要完全完成这项工作是极其困难的——至少有三个问题/错误在起作用。

试试这个..界面生成器景观设计

特别注意它说“并且你需要在任何地方正确使用 shouldAutorotateToInterfaceOrientation”它意味着无处不在,你的所有全屏视图。

希望对这场噩梦有所帮助!

一个重要的提醒是手头的另一个众所周知的问题:如果您尝试在多个视图(所有景观)之间进行交换,它根本不起作用。记住这一点很重要,否则你会在这个问题上浪费几天的时间。这实际上是不可能的。这是 iOS 平台上最大的已知漏洞。从字面上看,没有办法让硬件使您加载的第二个视图成为风景。烦人但简单的解决方法,以及您必须做的,是拥有一个微不足道的主 UIViewController,它什么也不做,只是坐在那里让您在视图之间交换。

换句话说,在 iOS 中因为一个重大的已知错误:

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

你只能这样做一次。稍后,如果您尝试删除 happyThing.view,而是将 newThing.view 放在那里,它不起作用 - 就是这样。机器永远不会将视图旋转为横向。没有任何技巧可以修复,即使 Apple 也无法使其正常工作。您必须采用的解决方法是拥有一个整体 UIViewController,它只是坐在那里并只保存您的各种视图(happyThing、newThing 等)。希望能帮助到你!

于 2010-03-27T21:13:17.970 回答
40

来自 Apple 开发网站:

要以横向模式启动应用程序以便状态栏立即位于适当的位置,请编辑 Info.plist 文件以添加具有适当值(UIInterfaceOrientationLandscapeRight 或 UIInterfaceOrientationLandscapeLeft)的 UIInterfaceOrientation 键,如清单 2 所示。

清单 2:以横向模式启动应用程序

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
于 2008-08-31T14:38:14.460 回答
28

所有帖子的总结和整合,经过我自己的测试;检查下面的 4.x、5.x 的更新。

从 3.2 开始,您无法从代码更改正在运行的应用程序的方向。

但是您可以以固定的方向启动应用程序,尽管这样做并不简单。

试试这个食谱:

  1. UISupportedInterfaceOrientationsInfo.plist文件中设置您的方向
  2. 在您的窗口中定义一个 480x320 的“基本视图控制器”。每个其他视图都将作为子视图添加到其视图中。
  3. 在所有视图控制器中设置shouldAutorotateToInterfaceOrientation:方法(当然,返回您在 plist 中定义的相同值)
  4. 在所有视图控制器中设置背景视图

    self.view.frame = CGRectMake(0, 0, 480, 320)

    viewDidLoad方法中。

更新(iOS 4.x、5.x):Apple iOS App Programming Guide 在“Advanced App Tricks”一章中有“Launching in Landscape Mode”段落。

参考:

于 2010-05-07T11:02:01.247 回答
8

首先我在 info.plist 中设置

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

然后我把这段代码放在 applicationDidFinishLaunching 中:

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

这样我就可以在 Interface Builder 中以横向模式处理视图。

于 2009-11-20T20:58:38.277 回答
7

sasb 和 michaelpryor 的回答似乎是正确的,但如果它不适合你,试试这个替代方案:

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

或者这个:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

或者这个:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

您可能还需window makeKeyAndVisible;要先打电话。

几个链接:在横向模式下开发iPhone SDK:如何只强制横向模式?

@Robert:请参阅iPhone SDK、NDA 和 Stack Overflow

于 2008-08-31T15:01:21.957 回答
6

我很惊讶还没有人提出这个答案:

shouldAutorotateToInterfaceOrientation在我的所有测试中,当关闭模态视图控制器时,即使是 UINavigationController 的一部分,也会尊重父视图控制器的首选方向设置。所以解决这个问题很简单:

创建一个带有 UIImageView 作为背景的虚拟 UIViewController。将图像设置为您的应用在启动时使用的 default.png 图像。

viewWillAppear在你的根视图控制器中被调用时,只显示没有动画的虚拟视图控制器。

viewDidAppear在您的虚拟视图控制器中被调用时,使用漂亮的交叉溶解动画关闭视图控制器。

这不仅有效,而且看起来不错!顺便说一句,为了澄清,我这样做根视图控制器是viewWillAppear这样的:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}
于 2010-11-27T07:38:02.030 回答
5

最新的 iPhone OS 编程指南对此有完整的部分,并附有示例代码。我相信这是最近添加的,所以也许你错过了。它解释了您必须遵守的所有条件;基本上...

  • 设置 Info.plist 属性(这会更改状态栏的位置,但不会更改视图)
  • 在您的 UIViewController viewDidLoad: 方法或 applicationDidFinishLaunching: 方法上手动围绕其中心旋转视图,或实现自动旋转(“自动调整行为”,第 124 页)

查找“以横向模式启动”,第 102 页。

于 2008-09-04T21:57:05.077 回答
4

看到这个答案:横向模式仅适用于 iPhone 或 iPad

  1. 向 plist 添加方向
  2. shouldAutorotateToInterfaceOrientation = YES 在所有文件中

虽然如果你使用混合模式,你可能会更好

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
于 2011-03-06T07:56:44.363 回答