2011-11-20 51 views
3

我正在制作一个仅支持iOS设备横向模式的应用程序。因此,我已将其设置为仅在shouldAutorotateToInterfaceOrientation:中为UIInterfaceOrientationLandscapeRightUIInterfaceOrientationLandscapeLeft返回YES,并将Info.plist中的初始方向设置为UIInterfaceOrientationLandscapeRight。该应用程序显示正常。为什么ViewController的初始方向不是风景的时候应该是?

问题是,直到视图完成加载后,坐标系才会处于横向状态(当我正确应用时,我不太确定)。我知道的是,它在启动时调用:shouldAutorotateToInterfaceOrientation时会更改为正确的坐标空间。问题是当viewDidLoadinitWithCoder:被调用时,它在错误的坐标空间中,在shouldAutorotate...之前。

我的意思是,如果我用CGRectMake(0, 0, 480, 320)(而不是使用self.view.frame或其他东西)设置视图的全屏宽度,当坐标空间旋转“更正”时,它会显示为borked。在viewDidLoad创建的视图有一个旋转适用于他们,所以他们是错的。这使得在这些方法中设置观点是一种痛苦,而且确实不合逻辑。我猜测这是如何处理方向的问题。为什么它的行为如此?我已尽可能地告诉它我只想要景观位置。这可以用界面生成器和属性吗?

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

回答

7

支持取向变化是iOS开发人员在某个时间或任何时候都需要努力的事情。这往往令人困惑和沮丧。这里的经验,这将处理所有方向的问题95%的规则:

方向相关的接口变化(如帧大小调整)不发生,直到viewWillAppear:。在此之前,即使您仅支持应用中的横向视图,或者您的应用已处于横向模式,您的视图仍将处于纵向模式

由于viewDidLoad:发生在viewWillAppear:之前,因此还未发生方向布局更改。所以,做任何在viewDidLoad以下将通常具有靠不住的结果(取决于视图的自动调整的设置):

  • 插入有框架的视图,它等于内部的层(例如,梯度)视图的界限。插入的图层始终是纵向模式下视图的大小。如果该视图在旋转到横向视图时伸展,则图层将比视图小。
  • 试图确定表视图的大小和使用该框架的一些其他视图
  • 手动添加子视图控制器并使用容器视图的框架来确定子视图控制器的视图框架。
+0

谢谢!这非常有帮助。伟大的经验法则。 – ErikPerik

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时)的不同时间。

+0

感谢您的深刻见解。在iOS进行循环检查之前,我正在为这些视图制作动画,所以这可能会激起结果? – ErikPerik

0

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

+0

尽管Info.plist中唯一支持的接口方向是“UIInterfaceOrientationLandscapeRight”,但我仍然遇到此问题。在我看来,这很奇怪。 – ErikPerik

相关问题