【问题标题】:Optimization for newest iPad Pro Simulator针对最新 iPad Pro 模拟器的优化
【发布时间】:2015-12-10 03:16:39
【问题描述】:

我已安装最新的 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。
  • @GergelyKovacs 现在我不知道如何让它工作。我将在下周回到这个问题。如果我觉得有趣,我会描述结果。
  • @AlexanderBalabanov - 您能否提供有关您遇到的问题的更多信息,以便我们提供帮助?我也在对 iPad Pro 支持进行故障排除,并希望确保我们都能适当地支持它。你在哪里运行你的 NSLog 语句来查看视图边界?你在使用自动布局吗?如果您可以向我们提供更多关于您正在经历的事情的背景信息,那么希望我们可以共同努力解决这个问题。

标签: ios objective-c xcode ios-simulator xcode7.1beta


【解决方案1】:

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

【讨论】:

  • 我的应用程序和测试应用程序也有一个启动故事板,我将它们放在一起以确认此行为,但正如我在回答中解释的那样,我直到稍后才看到实际大小视图控制器生命周期。当您说“我的应用以正确的大小启动”时,您在哪里确认?您的启动故事板是否具有特定配置?我的启动故事板只是设置为默认值:推断大小/方向/等。启动图像正确显示,但 VC 直到稍后才获得正确的边界。
  • 我通过简单地记录窗口大小矩形来确认正确的大小。不,我不使用任何特别的东西;如此之多,以至于我实际上使用了一个简单的 .xib 推断大小(不是故事板),但它应该给出相同的结果。
【解决方案2】:

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


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

【讨论】:

  • 新的viewWillTransitionToSize:withTransitionCoordinator: 方法也会为您提供正确的框架几何形状
  • 感谢您的评论@KoreyHinton!我还没有看过这个,所以可能是这种情况 - 但是,由于viewWillTransitionToSize:withTransitionCoordinator: 并不是标准视图控制器生命周期的一部分,因此仅仅为了获得正确的大小而实现它感觉有点不必要。根据 Apple 的文档,这是针对“尺寸和特征变化”的,我不希望有任何变化,因为 iPad 和 iPad Pro 在纵向和横向方向上都是常规/常规。
  • Downvoter:您能否就您的担忧发表评论,以便我可以尝试用我的答案来解决它?我知道虽然我无法解释 Apple 的框架如何在后端处理这个问题,但我发布的信息是准确的,并且可以从视图控制器生命周期内访问实际的 iPad Pro 边界,尽管可能不是当我们期望他们成为。请让我知道您会发现哪些其他信息有用,我很乐意根据需要进行研究/更新。谢谢。
  • 关于该方法不是视图生命周期的一部分的好点。 viewDidLayoutSubviews 是通过在更改后检查视图的大小来更改帧的可靠位置。我提到的方法为您提供了视图大小更改之前的大小。我的评论是一个旁白,因为框架几何形状很棘手,而不是作为校正,因为您的数据显示了尺寸变化的完整生命周期。不知道为什么有人对你投了反对票,我发现你的回答很有帮助,当我发现它时给你投了赞成票
【解决方案3】:

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

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

【讨论】:

  • 我正在使用自动布局和动态框架。我没有任何硬代码框架。这很奇怪,但它不能正常工作......
  • 但是,什么不适合你?在问题中,您提到您的应用运行良好。
  • 一切正常,但我想在 iPad Pro 模拟器上获得 self.view.bounds.size.width 值 == 1366。我只有 1024。但是当我在 Xcode 7.1 中创建一个新项目时,self.view.bounds.size.width 值 == 1366。
  • 是的。我想它按预期工作。当您使用 ios 9 sdk 构建应用程序时,它会为您提供正确的 iPad Pro 点大小。如果它是较旧的 sdk,它可能会返回您现有的 iPad 尺寸。但是,我从未测试过它。事实上我还没有安装 xcode 7。
  • 如果我能在旧项目中找到解决此问题的解决方案,我会发布它。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2016-02-25
  • 2016-02-28
  • 2017-05-25
  • 2015-12-06
  • 2016-02-19
  • 2017-03-04
相关资源
最近更新 更多