为什么ViewController的初始方向应该是不应该是横向的?

时间:2011-11-20 18:31:44

标签: ios objective-c cocoa-touch orientation

我正在制作一款仅支持iOS设备横向模式的应用。所以我将其设置为仅UIInterfaceOrientationLandscapeRight中的UIInterfaceOrientationLandscapeLeftshouldAutorotateToInterfaceOrientation:返回YES,并将Info.plist中的初始方向设置为UIInterfaceOrientationLandscapeRight。该应用程序显示正常。

问题是在视图完成加载之前坐标系不是横向的(我在这里正确应用它时并不是特别确定)。我所知道的是,它在启动时调用:shouldAutorotateToInterfaceOrientation时会更改为正确的坐标空间。问题是,当viewDidLoadinitWithCoder:都被调用时,它位于错误的坐标空间中,在shouldAutorotate...之前。

我的意思是,如果我使用CGRectMake(0, 0, 480, 320)设置一个视图到屏幕的整个宽度(而不是使用self.view.frame或其他东西),当坐标空间旋转“更正”时,它会被borked 。在viewDidLoad中创建的视图会应用旋转,因此它们是错误的。这使得在这些方法中设置视图既痛苦又非常不合逻辑。我猜这是一个如何处理方向的问题。为什么它会像这样?我已经尽可能地告诉它我只想要风景位置。这可以用于Interface构建器和属性吗?

这是使用标准UIViewController。但是,新视图也是从viewDidLoad中的.xib文件加载的。这可能是问题吗?

3 个答案:

答案 0 :(得分:8)

对于方向更改的支持是所有 iOS开发人员在某个时刻都在努力解决的问题。它经常令人困惑和沮丧。这是一个经验法则,它将处理所有方向问题的95%:

  

viewWillAppear:之前不会发生与方向相关的界面更改(例如帧大小调整)。在此之前,您的视图将处于纵向模式,即使您只在应用中支持横向或您的应用已处于横向模式

由于viewDidLoad:发生在viewWillAppear:之前,因此尚未发生方向布局更改。因此,在viewDidLoad中执行以下任何操作通常会产生不稳定的结果(取决于视图的autoResize设置方式):

  • 在视图内插入一个层(如渐变),其框架等于视图的边界。插入的图层将始终为纵向模式下视图的大小。如果在旋转到横向视图时该视图会延伸,则图层将小于视图。
  • 尝试确定表格视图的大小,并将该框架用于其他视图
  • 手动添加子视图控制器并使用容器视图的框架来确定子视图控制器的视图框架。

答案 1 :(得分:1)

我今天刚刚阅读了UIViewController文档,我记得读过这篇文章。

从“处理视图轮换”概述部分:

  

默认情况下,UIViewController类仅以纵向模式显示视图。要支持其他方向,必须覆盖shouldAutorotateToInterfaceOrientation:方法,并为子类支持的任何方向返回YES。如果正确配置了视图的自动调整属性,则可能只需要执行此操作。但是,UIViewController类为您提供了额外的钩子,以便根据需要实现其他行为。

     

...

     

注意:在启动时,应用程序应始终以纵向设置界面。返回application:didFinishLaunchingWithOptions:方法后,应用程序使用上述视图控制器旋转机制在显示窗口之前将视图旋转到适当的方向。

http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW57

如果您在子视图上设置autoresizingMask选项,我可以想到的一件事可能会给您带来额外的麻烦。如果您的所有数字都错误,可以预测旋转视图时会发生什么,调整大小非常困难。

如果您使用的是自定义UIVIews,则可能需要覆盖layoutSubviews:来处理可能需要再次布局子视图的不同时间(或者当您调用setNeedsLayout时)。

答案 2 :(得分:0)

您可以在[project] -info.plist文件中重新排序支持的界面方向,将item 0值设置为Landscape(右主页按钮)。