7

我已经安装了最新的 Xcode 7.1 beta 并尝试在 iPad Pro Simulator 上运行我的项目。一切都正确,所有功能都正常工作。

但是我对屏幕大小有疑问...

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

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

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

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

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

4

3 回答 3

3

我可能离这里很远,但我在 iPad Pro 模拟器上遇到了类似的问题:它一直给我标准的 1024*768 点分辨率。经过一番挖掘,我意识到我使用的是标准 iPad 启动图像(因为资产目录中没有 iPad Pro 版本),这将我的屏幕限制为保持 1024*768 点。一旦我介绍了一个启动故事板,一切就都到位了,我的应用程序以正确的 1366*1024 点大小启动。

于 2015-11-09T10:14:14.833 回答
1

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


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

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

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

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

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

于 2015-10-26T02:59:26.657 回答
0

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

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

于 2015-09-14T07:51:26.343 回答