【问题标题】:Get iPhone Status Bar Height获取 iPhone 状态栏高度
【发布时间】:2011-04-22 18:10:45
【问题描述】:

我需要根据 iPhone 状态栏的高度调整一些元素的大小。我知道状态栏通常高 20 点,但在网络共享模式下情况并非如此。它加倍到 40。确定它的高度的正确方法是什么?我试过了

[[UIApplication sharedApplication] statusBarFrame]

但它给了我 20 x 480 的横向分辨率,这是正确的,但它给了我 320 x 40 的纵向分辨率。为什么它没有给我相反的 (40 x 320)?

【问题讨论】:

  • 状态栏怎么可能是40px?
  • @Andy 当网络共享处于活动状态时,状态栏高度增加到 40px
  • 或者来电时

标签: iphone statusbar


【解决方案1】:

statusBarFrame 以屏幕坐标返回帧。我相信在视图坐标中获得这对应的正确方法是执行以下操作:

- (CGRect)statusBarFrameViewRect:(UIView*)view 
{
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil];

    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil];

    return statusBarViewRect;
}

现在在大多数情况下,窗口使用与屏幕相同的坐标,因此[UIWindow convertRect:fromWindow:] 不会更改任何内容,但如果它们可能不同,则此方法应该做正确的事情。

【讨论】:

  • -[UIViewController viewWillAppear:] 中调用此方法无效。两个问题: 1. 视图的窗口是nil 然后。 2. 即使我在使用if (view.window) 调用-[UIWindow convertRect:fromWindow:] 之前,当我在横向模式下弹回视图控制器时,statusBarFrame 的宽度和高度已切换并且对-[UIView convertRect:fromView:] 的调用没有正确切换回来.
  • @MattDiPasquale 为什么不在viewDidAppear: 中调用它呢?
  • 因为,我正在根据[UIApplication sharedApplication].statusBarFrame 调整self.collectionView.contentInset。如果我在视图出现后调整它,那么你可以看到它跳跃。所以,我必须在视图出现之前对其进行调整。
【解决方案2】:

你是这样做的吗:

CGRect rect;

rect = [[UIApplication sharedApplication] statusBarFrame];
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);

【讨论】:

  • 是的,我是。我在最初的问题中提到了这一点。
  • 也可以使用NSStringFromCGRect:NSLog(@"Statusbar frame: %@", NSStringFromCGRect(rect));
【解决方案3】:

编辑 iOS 11 确定视图内容顶部放置位置的方法是 UIView 的 safeAreaLayoutGuide 请参阅 UIView Documentation

不推荐使用的答案 如果您的目标是 iOS 7+,UIViewController 的文档建议 viewController 的 topLayoutGuide 属性为您提供状态栏的底部,或者导航栏的底部(如果它也是可见的)。这可能是有用的,而且肯定比许多以前的解决方案少。

【讨论】:

    【解决方案4】:

    您可以测试两个值中较小的那个,这将是真正的高度。

    【讨论】:

    【解决方案5】:

    此方法适用于纵向和横向。

    -(float) statusBarHeight
    {
        CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
        return MIN(statusBarSize.width, statusBarSize.height);
    }
    
    // example call
    float statusBarHeight = [self statusBarHeight];
    

    【讨论】:

    • 能否请您提供有关您的解决方案的更多详细信息,谢谢!
    • 这可以在你的 ViewController 实现中使用。例如在“viewDidLoad”方法中。
    【解决方案6】:

    斯威夫特 2:

    let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height
    

    Swift 3 或 Swift 4:

    let statusBarHeight = UIApplication.shared.statusBarFrame.height
    

    建议:不要忘记注入UIApplication.shared,不要只在代码中使用单例。

    【讨论】:

    • 我为什么不想使用单例?
    【解决方案7】:

    如果有人需要,这里是 Swift 版本:

    var screenStatusBarHeight: CGFloat {
        return UIApplication.sharedApplication().statusBarFrame.height
    }
    

    这是作为标准变量包含在:

    https://github.com/goktugyil/EZSwiftExtensions

    免责声明:这是我的回购

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2018-08-16
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2019-11-23
      • 1970-01-01
      相关资源
      最近更新 更多