iOS7和iOS8返回不同的UIScreen边界

4

我将申请部署目标 >= 7.1。然后我发现了这个“bug”... 应用程序只在横屏模式下运行!

代码:

CGSize frameSize = [[UIScreen mainScreen] bounds].size;

在iOS7 (iPhone 4)中,返回了CGSize (width=320, height=480),但必须返回480x320(因为在横屏模式下运行应用程序)。 在iOS8 (iPhone 4S)中,返回了CGSize (width=480, height=320) - 正确的结果。
给人的印象是iOS7返回了框架而没有检查横竖屏模式,并返回了纵向模式的大小。
谢谢。
2个回答

6

在iOS 8中API有所改变。

iOS 8中是依赖于方向的,不是一个bug。您可以查看WWDC 2014的214个会话以获取更多信息:“iOS 8中视图控制器的改进

演示文稿中的引用:

UIScreen现在是面向接口的:

[UIScreen bounds] now interface-oriented
[UIScreen applicationFrame] now interface-oriented
Status bar frame notifications are interface-oriented
Keyboard frame notifications are interface-oriented

可能是重复问题:[UIScreen mainScreen].bounds.size在iOS8中是否变得与方向相关? 为了实现您的目标,请检查iOS版本并相应地运行代码: 我们如何以编程方式检测设备正在运行的iOS版本? 希望这可以帮助到您。

2
“-convertRect:fromWindow:nil” 不应该继续执行正确的操作吗?如果是这样,那么作者就没有必要编写自己的小型自定义转换代码并进行版本检查了。只需使用预期的内置方法即可。 - Tommy

6

iOS 8之后屏幕的行为发生了改变。

引用 UIScreen 文档:

iOS 8之前,屏幕bounds矩形总是反映相对于纵向朝上方向的屏幕尺寸。将设备旋转到横向或颠倒方向不会更改bounds。在iOS 8及更高版本中,屏幕的bounds属性考虑了屏幕的界面方向。这种行为意味着设备处于纵向方向时的bounds可能与设备处于横向方向时的bounds不同。依赖屏幕尺寸的应用程序可以使用fixedCoordinateSpace属性中的对象作为任何必须进行的计算的固定参考点。


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