横向模式下的iPhone应用程序,2008系统

注:这个问题是从2008年开始的,现在只是历史性的兴趣。


无论设备的位置如何,创build从横向模式运行的iPhone应用程序的最佳方式是什么?

以编程方式和使用Interface Builder。

只有历史的答案。 壮观地过时:

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

这篇文章只是一个历史的好奇心。


令人兴奋的消息! 正如下面安德鲁发现的,这个问题已经被苹果公司在4.0以上修复了。

似乎不再需要强调每一种观点的观点,解决了“第一次工作”的具体严重问题。

截至2011年4月,不可能testing甚至低于4.0的任何东西,所以这个问题纯粹是一个历史的好奇心。 这是多么令人难以置信的开发人员这么长时间的麻烦!


这里是最初的讨论和解决scheme。 现在这是完全不相干的,因为这些系统甚至不可操作。


完成这项工作极为困难 – 至less有三个问题/错误在起作用。

试试这个界面生成器的景观devise

尤其要注意的是,在所有地方都需要正确使用shouldAutorotateToInterfaceOrientation”的地方,意味着无处不在,所有的全屏视图。

希望它在这个噩梦帮助!

这里还有另一个众所周知的问题的重要提醒:如果你正试图在MORE THAN ONE视图(所有的景观)之间进行交换,那么它简直不起作用 。 记住这一点很重要,否则你会浪费几天的时间。 这是从字面上不可能的。 这是iOS平台上最大的公开的已知错误。 没有办法让硬件使你加载的第二个视图,是风景。 烦人的,但简单的解决方法,你必须做什么,有一个微不足道的大师UIViewController什么都不做,只是坐在那里,让你交换你的意见。

换句话说,在iOS中,由于一个主要的知道错误:

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

你只能做一次 。 后来,如果你试图删除happyThing.view,而不是在那里newThing.view,它不工作 – 这就是。 机器永远不会将视图旋转到风景。 没有任何技巧可以解决,即使是苹果公司也无法做到这一点。 你必须采取的解决方法是有一个整体UIViewController,只是坐在那里,只是持有你的各种意见(happyThing,newThing等)。 希望能帮助到你!

从Apple Dev站点:

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

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

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

所有post的摘要和整合,经过我自己的testing; 检查下面4.x,5.x的更新。

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

但是你可以用一个固定的方向开始一个应用程序,虽然这样做并不简单。

试试这个配方:

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

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

    viewDidLoad方法中。

更新(iOS 4.x,5.x) :Apple iOS应用程序编程指南在“高级应用程序技巧”一章中提供了“在横向模式下启动”段落。

参考文献:

  • 界面生成器景观devise
  • 界面生成器景观devise-1

首先我在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)]; 

这样我可以在界面生成器中以横向模式处理视图。

sasb和michaelpryor的答案似乎是正确的,但如果它不适合你,请尝试下面的select:

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

或者这个:

 [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 

或者这个:

 [application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO]; 

您可能还必须调用window makeKeyAndVisible; 第一。

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

@Robert:请参阅iPhone SDK,NDA和堆栈溢出 。

最新的iPhone操作系统编程指南有一个完整的章节,以及示例代码。 我相信这是最近的一个补充,所以也许你错过了。 它解释了你必须遵守的所有条件; 基本上…

  • 设置Info.plist属性(这改变了状态栏的位置,但不是视图)
  • 在你的UIViewController的viewDidLoad:方法或你的applicationDidFinishLaunching:方法的周围手动旋转你的视图,或者实现自动旋转(“自动调整行为”,第124页)

寻找“在风景模式下启动”,第102页。

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

在我所有的testing中,当解除一个模式视图控制器的时候,即使当UINavigationController的一部分,父视图控制器在shouldAutorotateToInterfaceOrientation设置的首选方向也是可以的。 所以解决这个问题很简单:

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

viewWillAppear在你的根视图控制器中被调用时,只是呈现没有animation的虚拟视图控制器。

viewDidAppear在你的虚拟视图控制器中被调用时,用一个很好的交叉消解animationclosures视图控制器。

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

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

看到这个答案: 景观模式只适用于iPhone或iPad

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

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

 [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];