48

我有点生气。我有一个应用程序,其状态栏在主窗口中可见。因为我想动态设置我的视图和它们的帧大小(例如,在通话期间状态栏可能占用 40 像素)。

我可以做以下两个之一:

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

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

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

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

有什么帮助吗?

4

5 回答 5

50

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

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

于 2012-08-13T01:50:46.850 回答
8

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

于 2011-07-08T15:52:16.457 回答
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;
}
于 2012-04-22T01:23:39.813 回答
0

你可以看看 UIWindow。它继承自 UIView,因此它具有边界和框架,并且 iOS 应用程序都是单窗口。-[UIApplication keyWindow] 将返回应用委托设置的窗口。由于所有其他视图都锚定在主窗口中,我想这应该给你正确的界限。

于 2011-03-01T06:06:11.083 回答
0

斯威夫特 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)
}
于 2015-12-24T09:49:29.580 回答