iPhone app in landscape mode, 2008 systems

ios objective-c landscape

66874 观看

8回复

28918 作者的声誉

Please note that this question is from 2008 and now is of only historic interest.


What's the best way to create an iPhone application that runs in landscape mode from the start, regardless of the position of the device?

Both programmatically and using the Interface Builder.

作者: Michiel de Mare 的来源 发布者: 2008 年 8 月 2 日

回应 (8)


40

15911 作者的声誉

来自Apple Dev网站:

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

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

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
作者: Michael Pryor 发布者: 31.08.2008 02:38

6

15403 作者的声誉

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

作者: Sören Kuklau 发布者: 31.08.2008 03:01

4

0 作者的声誉

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

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

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

作者: Miguel A. Friginal 发布者: 04.09.2008 09:57

7

34987 作者的声誉

首先我在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中处理视图。

作者: samvermette 发布者: 20.11.2009 08:58

46

20568 作者的声誉

决定

Historic answer only. Spectacularly out of date.

Please note that this answer is now hugely out of date/

This answer is only a historical curiosity.


Exciting news! As discovered by Andrew below, this problem has been fixed by Apple in 4.0+.

It would appear it is NO longer necessary to force the size of the view on every view, and the specific serious problem of landscape "only working the first time" has been resolved.

As of April 2011, it is not possible to test or even build anything below 4.0, so the question is purely a historic curiosity. It's incredible how much trouble it caused developers for so long!


Here is the original discussion and solution. This is utterly irrelevant now, as these systems are not even operable.


It is EXTREMELY DIFFICULT to make this work fully -- there are at least three problems/bugs at play.

try this .. interface builder landscape design

Note in particular that where it says "and you need to use shouldAutorotateToInterfaceOrientation properly everywhere" it means everywhere, all your fullscreen views.

Hope it helps in this nightmare!

这里有一个重要的提醒:这里有一个众所周知的问题:如果你试图在多于一个视图(所有景观)之间进行交换,那么IT简单就行不通了。记住这一点至关重要,否则你会在这个问题上浪费时间。这实际上是不可能的。它是iOS平台上最大的已知漏洞。实际上没有办法让硬件使你加载的第二个视图成为风景。烦人但简单的解决方法,以及你必须做的,是有一个简单的主UIViewController除了坐在那里让你在你的视图之间交换什么都不做。

换句话说,在iOS中,因为一个主要的知识错误:

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

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

作者: Fattie 发布者: 27.03.2010 09:13

27

6393 作者的声誉

所有帖子的总结和整合,经过自己测试后; 检查以下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应用程序编程指南在“高级应用程序技巧”一章中有一个“在横向模式下启动”段落。

参考文献:

作者: IlDan 发布者: 07.05.2010 11:02

5

1478 作者的声誉

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

在我的所有测试中,当解雇模态视图控制器时,父视图控制器的首选方向设置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;
 }
...
}
作者: Arlen Anderson 发布者: 27.11.2010 07:38

3

225 作者的声誉

请参阅此答案:仅适用于iPhone或iPad的横向模式

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
作者: nicc 发布者: 06.03.2011 07:56
32x32