我有点恼火。我有一个应用程序,状态栏在主窗口中可见。因为我想动态设置我的视图和框架大小(例如,在电话呼叫期间,状态栏可能占用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像素时,这并不是很有用。
任何帮助?
答案 0 :(得分:50)
实际上这非常有用
当您向UIScreen
询问Bounds
时,您将获得屏幕边界,即整个设备屏幕。 (状态栏是屏幕的一部分)
但是,如果您要求UIScreen
告诉您应用程序的根视图在何处以及有多大,请求applicationFrame
是有用的。
除了在applicationFrame
坐标系中返回UIScreen bounds
之外,两个调用之间没有直接关系。 (但状态栏不是您的应用程序的一部分,可以解释不同的结果)
applicationFrame
用于应用程序窗口的框架矩形。 (只读)
@property(nonatomic,readonly)CGRect applicationFrame
讨论
此属性包含屏幕边界减去状态栏占用的区域(如果可见)。使用此属性是检索应用程序初始窗口大小的推荐方法。矩形以点数指定。
答案 1 :(得分:8)
实际上0不会从状态栏的底部开始。它从它的顶部开始。在(0,0)处添加UILabel除非您隐藏状态栏,否则您将看不到它。因此,bounds为您提供了总屏幕区域,applicationFrame为您提供了应用程序必须使用的区域。我打赌如果你隐藏状态栏,应用程序框架将匹配边界。
答案 2 :(得分:1)
我有类似的问题。我正在做的事情非常愚蠢,但我希望这有助于某人。
在子视图中,我有:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UIView * otherSubview = [[UIView alloc] initWithFrame:frame];
[self addSubview:otherSubview];
}
return self;
}
因为我创建的子视图的原点不在(0,0),但是然后使用同一帧为我的子视图生成子视图,这些子视图也向下移动。结果就是你提到的恼人的黑色横幅。
我通过执行以下操作来修复此问题:
- (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;
}
答案 3 :(得分:0)
你可能会看看UIWindow。它继承自UIView,因此它将具有边界和框架,iOS应用程序都是单一窗口。 - [UIApplication keyWindow]将返回app delegate设置的窗口。由于所有其他视图都锚定在主窗口中,我想这应该给你正确的界限。
答案 4 :(得分:0)
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)
}