【问题标题】:How to get the actual [UIScreen mainScreen] frame size?如何获得实际的 [UIScreen mainScreen] 帧大小?
【发布时间】:2011-07-06 06:24:17
【问题描述】:

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

有什么帮助吗?

【问题讨论】:

  • 在处理 iPhone 5 时特别有用。
  • 这是完全正确和好的。在这种情况下,边界是物理玻璃屏幕,而 applicationFrame 就是没有状态栏的那个。为了清楚起见,它们都在 SAME 坐标,即“玻璃”坐标中。所以边界从零开始(显然!),而应用程序框架从状态栏结束的地方开始——在 19 之后的 1,即 20!
  • CGPoint p = [[UIScreen mainScreen] bounds].origin; CGSize s = [[UIScreen mainScreen] applicationFrame].size; CGRectMake(p.x, p.y, s.width, s.height);如果你真的想要一个的原点和另一个的大小。

标签: uiview frame uiapplication


【解决方案1】:

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

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

【讨论】:

  • 我在带有 iOS7 的 iPhone 4 上得到 460[[UIScreen mainScreen] applicationFrame].size.height(没有电话、热点或任何改变状态栏高度的东西......)。 bounds 给我480 height...
  • @AvielGross 谢谢,我不记得我在什么方面偶然发现了 iOS7 中的不同(可能是 iOS 7 的预发布版本,或者是在一个非常糟糕的梦中.. .),但我今天无法重现它,所以我更新了我的答案。再次感谢您的更正。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。我所做的非常愚蠢,但我希望这对某人有所帮助。

    在我的子视图中:

    - (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;
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2014-11-21
          • 1970-01-01
          • 2019-09-04
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-12
          相关资源
          最近更新 更多