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

时间:2011-03-01 05:21:07

标签: uiview frame uiapplication

我有点恼火。我有一个应用程序,状态栏在主窗口中可见。因为我想动态设置我的视图和框架大小(例如,在电话呼叫期间,状态栏可能占用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像素时,这并不是很有用。

任何帮助?

5 个答案:

答案 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)
}