笔记:这个问题是 2008 年提出的,现在只具有历史意义。


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

既可以通过编程方式也可以使用 Interface Builder。

有帮助吗?

解决方案

仅历史答案。非常过时:

请注意,这个答案现在已经过时了。

这篇文章是 只是历史的好奇心.


令人兴奋的消息!正如 Andrew 在下面发现的,这个问题已被 Apple 在 4.0+ 中修复。

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

截至 2011 年 4 月,不可能测试甚至构建 4.0 以下的任何版本,因此这个问题纯粹是出于历史好奇。令人难以置信的是,这么长时间以来它给开发者带来了多大的麻烦!


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


要使这项工作完全发挥作用是极其困难的——至少存在三个问题/错误。

尝试这个 .. 界面构建器景观设计

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

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

重要提醒一下这里还有一个众所周知的问题:如果你想在之间交换 超过一个 视图(所有景观), 它根本不起作用. 。记住这一点很重要,否则你会在这个问题上浪费很多时间。这实际上是不可能的。这是 iOS 平台上最大的公开已知错误。实际上没有办法让硬件使您加载的第二个视图成为横向视图。烦人但简单的解决方法,以及你必须做的,是有一个简单的主 UIViewController,它什么也不做,只是坐在那里,让你在视图之间交换。

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

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

您只能这样做一次. 。稍后,如果您尝试删除 happyThing.view,然后放入 newThing.view,则它不起作用 - 就是这样。机器永远不会将视图旋转为横向。没有什么窍门可以解决,即使是苹果公司也无法让它发挥作用。您必须采用的解决方法是拥有一个整体 UIViewController,它只是坐在那里并仅保存您的各种视图(happyThing、newThing 等)。希望能帮助到你!

其他提示

来自苹果开发网站:

要以景观模式启动您的应用程序,以使状态栏立即处于适当的位置,请编辑您的info.plist文件以添加具有适当值的UInterfaceorientation键(uiinterfaceorientationlandlandscaperight或uiinterfaceorientationlandlandscapeleft),如列表2所示。

清单 2:以景观模式开始申请

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

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

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

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

尝试用这个食谱:

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

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

    在里面 viewDidLoad 方法。

更新(iOS 4.x、5.x): :Apple iOS 应用程序编程指南的“高级应用程序技巧”一章中有一个“以横向模式启动”段落。

参考:

首先我在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 中以横向模式处理视图。

sasb 和 michaelpryor 的答案似乎是正确的,但如果它不适合您,请尝试以下替代方案:

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

或者这个:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

或者这个:

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

您可能还需要致电 window makeKeyAndVisible; 第一的。

几个链接: 横向模式开发, iPhone SDK:如何强制仅横向模式?

@罗伯特:请参阅 iPhone SDK、NDA 和 Stack Overflow.

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

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

创建一个虚拟 UIViewController,并使用 UIImageView 作为背景。将图像设置为应用程序启动时使用的 default.png 图像。

什么时候 viewWillAppear 在根视图控制器中被调用,只需呈现没有动画的虚拟视图控制器。

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

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

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

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

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

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

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

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

尽管如果您使用混合模式,您可能会更好

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top