如何获得实际的[UIScreen主屏幕]框架大小?

run*_*mad 48 frame uiview uiapplication

我有点恼火.我有一个应用程序,状态栏在主窗口中可见.因为我想动态设置我的视图和框架大小(例如,在电话呼叫期间,状态栏可能占用40个像素).

我可以做两个中的一个:

[[UIScreen mainScreen] bounds];
[[UIScreen mainScreen] applicationFrame];
Run Code Online (Sandbox Code Playgroud)

真正烦人的是这两个输出两组不同的值,每个值同样无用.

bounds将输出:{{0, 0}, {320, 480}}while
applicationFrame将输出{{0, 20}, {320, 460}}

如您所见,bounds给出正确的y原点(0从状态栏的正下方开始)但是然后给出480的高度,这是不正确的.它应该是460,因为状态栏是可见的.然后我们applicationFrame开始在状态栏下面20个像素(所以有一个上限),但然后给出正确的高度.但是,当它被推下20像素时,这并不是很有用.

有帮助吗?

Vin*_*ier 50

实际上这非常有用.
当你问UIScreen它时,Bounds你得到了屏幕的边界,这是整个设备的屏幕.(状态栏是屏幕的一部分)
但是如果你要求a UIScreen告诉你应用程序的根视图在哪里以及有多大要求它applicationFrame是有用的.除了applicationFrameUIScreen bounds坐标系中返回之外,两个调用之间没有直接关系.(但状态栏不是您的应用程序的一部分,可以解释不同的结果)

applicationFrame
用于应用程序窗口的框架矩形.(
只读)@property(非原子,只读)CGRect applicationFrame
讨论
此属性包含屏幕边界减去状态栏占用的区域(如果可见).使用此属性是检索应用程序初始窗口大小的推荐方法.矩形以磅为单位指定.


tup*_*oor 8

实际上0不会从状态栏的底部开始.它从它的顶部开始.在(0,0)处添加UILabel除非您隐藏状态栏,否则您将看不到它.因此,bounds为您提供了总屏幕区域,applicationFrame为您提供了应用程序必须使用的区域.我打赌如果你隐藏状态栏,应用程序框架将匹配边界.