如何获得实际的帧大小?

我有点恼火 我有一个在主窗口中可见的状态栏的应用程序。 由于我想dynamic设置我的视图和帧大小(例如,在通话过程中,状态栏可能需要40个像素)。

我可以做两个之一:

[[UIScreen mainScreen] bounds]; [[UIScreen mainScreen] applicationFrame]; 

真烦人的是这两个输出两组不同的值,每个都是一样的无用。

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

正如你所看到的, bounds给出了正确的y原点(0从状态栏右下方开始),但是却给出了480的高度,这是不正确的。 它应该是460,因为状态栏是可见的。 然后,我们有一个applicationFrame ,它在状态栏下面开始20像素(所以有一个帽子),但是会给出正确的高度。 但是,无论如何,当它被推下20个像素时,这并不是很有用。

任何帮助?

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

applicationFrame
用于应用程序窗口的框架矩形。 (只读)
@属性(非primefaces,只读)CGRect applicationFrame
讨论
该属性包含屏幕边界减去状态栏占用的区域(如果可见)。 推荐使用此属性来检索应用程序的初始窗口大小。 矩形是用点来指定的。

实际上0不会在状态栏的底部开始。 它从顶部开始。 在(0,0)处添加一个UILabel,除非隐藏状态栏,否则不会看到它。 所以界限给你的总屏幕区域,applicationFrame给你你的应用程序必须使用的区域。 我敢打赌,如果你隐藏状态栏,应用程序框架将与界限相匹配。

我有一个类似的问题。 我正在做的是非常愚蠢的,但我希望这有助于某人。

在子视图中我有:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIView * otherSubview = [[UIView alloc] initWithFrame:frame]; [self addSubview:otherSubview]; } return self; } 

因为我用一个起源不是 (0,0)的框架创build我的子视图,但是使用相同的框架为我的子视图生成子视图,这些子视图也被移下来。 结果是你提到的恼人的黑色旗帜。

我通过执行以下操作来解决此问题:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { CGRect rect = frame; rect.origin.x = 0; rect.origin.y = 0; UIView * otherSubview = [[UIView alloc] initWithFrame:rect]; [self addSubview:otherSubview]; } return self; } 

你可能会看UIWindow。 它从UIViewinheritance,所以它将有边界和框架,iOS应用程序都是单个窗口。 – [UIApplication keyWindow]将返回应用程序委托设置的窗口。 由于所有其他视图都在主窗口中,所以我想这应该给你正确的界限。

Swift 2.0更新:

 func presentAboveAll() { //Get the view from the nib. Assuming the view is is in AboveAllView.xib let nibContents = NSBundle.mainBundle().loadNibNamed("AboveAllView", owner: nil, options: nil) //Get hold of your view let views = nibContents.filter { if let _ = $0 as? UIView{ return true } return false } guard views.count > 0 else { return } //Set up frame and add to the app's key window let view = views.first as! UIView view.frame = UIScreen.mainScreen().bounds UIApplication.sharedApplication().keyWindow?.addSubview(view) }