针对最新的iPad Pro模拟器进行优化

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

但是我的屏幕尺寸有问题

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

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

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

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

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


我可能会离开这里,但我在iPad Pro模拟器上遇到类似的问题:它一直给我提供标准的1024 * 768分辨率。 经过一番挖掘,我意识到我正在使用标准的iPad启动图像(因为资产目录中没有iPad Pro版本),这限制了我的屏幕保持1024 * 768点。 一旦我推出了发布故事板,一切就会落实到位,我的应用程序以正确的1366 * 1024磅的尺寸发布。


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


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

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

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

我在控制台上看到以下视图控制器生命周期的输出:

-[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:调用时间确定。 但是,正如您所看到的,这实际上取决于您的视图层次结构 - 所以我建议您确认视图层次结构,然后确定添加依赖于决议的代码的最佳位置。


如果您由于某些原因而硬编码任何UI元素的框架,则可能需要为即将推出的iPad Pro进行更改。 因为它的屏幕尺寸(以点为单位)完全不同。

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

链接地址: http://www.djcxy.com/p/87857.html

上一篇: Optimization for newest iPad Pro Simulator

下一篇: std::set insert with initialiser lists