iOS7和iOS8返回不同的UIScreen界限

Zhu*_*ukV 4 iphone objective-c ios ios7 ios8

我为部署目标> = 7.1创建应用程序.我看到了"bug"......应用程序只在横向模式下运行!

码:

CGSize frameSize = [[UIScreen mainScreen] bounds].size;
Run Code Online (Sandbox Code Playgroud)

在iOS 7(iPhone 4)中,返回CGSize (width=320, height=480),但必须返回480x320(因为在横向模式下运行应用程序).在iOS 8(iPhone 4S)中,返回CGSize (width=480, height=320)- 正确的结果.

iOS 7在没有检查横向/纵向模式的情况下返回帧的印象,以及纵向模式的返回尺寸.

谢谢.

Sul*_*han 6

iOS 8中的行为已更改.

引用UIScreen文档

在iOS 8之前,屏幕边界矩形始终反映相对于纵向向上的屏幕尺寸.将设备旋转到横向或倒置方向不会改变边界.在iOS 8及更高版本中,屏幕的边界属性会考虑屏幕的界面方向.此行为意味着纵向设备的边界可能与横向设备的边界不同.依赖于屏幕尺寸的应用程序可以将fixedCoordinateSpace属性中的对象用作它们必须进行的任何计算的固定参考点.


Mru*_*nal 6

是的iOS 8的API有变化.

是的,它在iOS8中取决于方向,而不是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
Run Code Online (Sandbox Code Playgroud)

可能重复的问题:[UIScreen mainScreen] .bounds.size在iOS8中是否依赖于方向?

要实现您的目标,请检查iOS版本并相应地运行代码:

我们如何以编程方式检测运行设备的iOS版本?

希望这可以帮助.

  • 不应该`-convertRect:fromWindow:nil`继续做正确的事情?如果是这样,则作者无需使用版本检查编写自己的小自定义转换代码.只需使用预期的内置方法? (2认同)