最新版iPad Pro模拟器的优化

7
我已经安装了最新的Xcode 7.1 beta,并尝试在iPad Pro模拟器上运行我的项目。一切都正确,所有功能都正常工作。
但我有一个屏幕大小的问题...
在应用程序的主屏幕上,我运行了下面的日志:
NSLog(@"%f", self.view.bounds.size.width);

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

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

你知道如何为我的旧项目解决这个问题吗?


这个问题有什么新消息吗?我也遇到了同样的问题。无论我做什么,iPad Pro模拟器中始终显示1024*768。 - Gergely Kovacs
@GergelyKovacs 目前我不知道如何让它工作。我打算下周回头解决这个问题。如果我找到了有趣的结果,我会进行描述。 - Oleksandr Balabanov
@AlexanderBalabanov - 你能提供一些关于你遇到的问题的更多信息吗,这样我们才能帮助你?我也在解决iPad Pro支持的问题,并希望确保我们都能适当地支持它。你在哪里运行你的NSLog语句来查看视图边界?你是否使用了自动布局?如果你能提供一些关于你所经历的情况的上下文,那么希望我们可以共同努力解决这个问题。 - Derek Lee
3个回答

3

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


我也为我的应用程序和测试应用程序准备了启动Storyboard,以确认此行为,但正如我在答案中解释的那样,直到视图控制器生命周期后我才看到实际大小。当您说“我的应用程序以正确的大小启动”时,您是在哪里确认这一点?您的启动Storyboard是否具有特定配置?我的启动Storyboard仅设置为默认值:推断大小/方向/等。启动图像显示正确,但VC直到稍后才能获得适当的边界。 - Derek Lee
我通过简单记录窗口大小矩形来确认正确的大小。我没有使用任何特殊工具,实际上我使用的是一个简单的.xib文件,它具有推断大小(而不是故事板),但应该会产生相同的结果。 - Gergely Kovacs

1
TL;DR: 看起来在iPad Pro屏幕大小上,视图层次结构直到调用viewWillLayoutSubviews:viewDidLayoutSubviews:才会进行调整。这取决于你的视图层次结构的构建方式。
在为我的iPad Pro更新应用时,我也看到了类似的行为。因此,我深入研究了视图控制器生命周期事件,以查看在我的现有项目和新项目中发生了什么。
对于全新的项目,使用一个仅具有导航栏(放置在状态栏下方)和主视图(占据其余空间,开启自动布局,在横向模式下,如下屏幕截图所示:

Sample view controller with navigation bar and auto-layout

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

-[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:ж–№жі•иҝҳе°ҶдёәжӮЁжҸҗдҫӣжӯЈзЎ®зҡ„жЎҶжһ¶еҮ дҪ•гҖӮ - Korey Hinton
1
感谢@KoreyHinton的评论!我还没有看过这个,所以也许是这样的情况-但是,由于viewWillTransitionToSize:withTransitionCoordinator:实际上不是标准视图控制器生命周期的一部分,仅实现它以获得正确的大小似乎有点不必要。根据Apple的文档,这是用于“大小和特征更改”,我不希望存在任何更改,因为iPad和iPad Pro在纵向和横向方向上都是常规/常规。 - Derek Lee
下投票者:您能否留下评论,让我可以尝试通过我的回答来解决您的问题?我知道虽然我无法提供苹果框架在后端如何处理此问题的解释,但我发布的信息是准确的,并且实际的iPad Pro边界可以从视图控制器生命周期内访问,尽管可能不是我们期望的时间。请告诉我您需要哪些额外信息,我很乐意进行研究/更新。谢谢。 - Derek Lee
1
关于该方法不是视图生命周期的一部分的观点很好。viewDidLayoutSubviews是一个可靠的位置,通过检查视图大小的变化来改变框架。我提到的方法给出了视图大小变化之前的大小。我的评论只是作为一个旁白,因为框架几何是棘手的,并不是作为一个更正,因为您的数据显示了完整的大小变化生命周期。不确定为什么有人对您进行了负投票,我发现您的答案很有帮助,并在找到它时给您点赞。 - Korey Hinton

0
如果由于某些原因硬编码了任何UI元素的框架,则可能需要为即将推出的iPad Pro更改它,因为它有完全不同的屏幕大小(以点为单位)。
如果使用自动布局和动态框架(例如self.view.bounds.size.width),我想应该可以正常工作。

我正在使用自动布局和动态框架。我没有任何硬编码框架。很奇怪,但它并不完美地工作... - Oleksandr Balabanov
一切都正常,但我想在iPad Pro模拟器上获得self.view.bounds.size.width值== 1366。 我只有1024。 但是当我在Xcode 7.1中创建一个新项目时,self.view.bounds.size.width值== 1366。 - Oleksandr Balabanov
是的。我猜它按预期工作。当您使用iOS 9 SDK构建应用程序时,它将为您提供正确的iPad Pro点大小。如果使用旧的SDK,则可能会返回现有的iPad大小。但是,我从未测试过。事实上,我还没有安装Xcode 7。 - Rashmi Ranjan mallick
如果我找到了解决旧项目中这个问题的方法,我会发布它。非常感谢。 - Oleksandr Balabanov
你需要添加一个启动屏幕文件,然后它会切换到全分辨率。否则它将保持旧的点大小。宽度为1024,以向下兼容现有应用程序。 - Darko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接