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

Eri*_*off 3 cocoa-touch objective-c orientation ios

我正在制作一个仅支持iOS设备横向模式的应用.因此我将其设置为仅返回YES UIInterfaceOrientationLandscapeRightUIInterfaceOrientationLandscapeLeftin shouldAutorotateToInterfaceOrientation:并将初始方向设置Info.plistUIInterfaceOrientationLandscapeRight.该应用程序显示正常.

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

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

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

mem*_*ons 8

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

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

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

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