优化最新的iPad Pro模拟器

我已经安装了最新的Xcode 7.1testing版,并尝试在iPad Pro模拟器上运行我的项目。 一切都是正确的,所有的function都是正确的。

但我有一个屏幕大小的问题…

在应用程序的主屏幕上,我运行下一个日志:

NSLog(@"%f", self.view.bounds.size.width); 

我有1024的横向方向。 但是,当我在Xcode 7.1中创build一个新的应用程序,并在主屏幕上运行相同的代码,我得到另一个值:1366。

今天我计划在使用Araxis Merge的旧Xcode(6.4)和最新beta 7.1中创build的项目文件之间寻找差异。

你现在如何解决我的旧项目这个问题?

我可能在这里,但我有一个类似的问题,与iPad Pro模拟器:它不断给我的标准1024 * 768分辨率。 经过一番挖掘,我意识到我使用的是标准的iPad启动图像(因为资产目录中没有iPad Pro版本),这限制了我的屏幕保持1024 * 768点。 一旦我推出了发布故事板,一切都落空了,我的应用程序启动了正确的,1366 * 1024点的大小。

TL; DR viewDidLayoutSubviews:在调用viewWillLayoutSubviews:viewDidLayoutSubviews:之前,似乎没有为iPad Pro屏幕大小调整视图层次结构。 当这个被布局系统调用时,取决于你的视图层次的构造。


在更新我的应用程序的iPad Pro我也看到类似的行为。 因此,我深入了解了视图控制器生命周期事件,以了解现有项目以及新项目中发生的情况。

对于一个全新的项目,使用仅具有导航栏(位于状态栏下方)的视图控制器和主视图(占用剩余的空间,打开自动布局,在横向模式下la下面的截图:

具有导航栏和自动布局的示例视图控制器

我从控制台的view controller生命周期中看到以下输出:

 -[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} -[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} -[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} 

从我在这里可以看到,视图始于1024点的宽度,但是一旦执行了“viewDidLayoutSubviews”,就确定了合适的尺寸(1366点)。

在我自己的一个屏幕上使用分割视图控制器的项目中,我可以看到类似的行为:

 -[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} -[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

在这种情况下,由于视图层次结构不同, viewWillLayoutSubviews:在视图控制器生命周期的早期被调用,正确的大小已经由viewWillAppear:被调用的时间确定了。 但是,正如你所看到的,这真的取决于你的视图层次结构 – 所以我build议你确认你的视图层次结构,然后确定最佳的位置来添加你的决议相关的代码。

如果您由于某些原因而硬编码任何UI元素的框架,则可能需要为即将到来的iPad专业版进行更改。 因为它总共有不同的屏幕尺寸(点数)。

如果你使用自动布局和dynamic帧(例如self.view.bounds.size.width),它应该工作正常,我猜。