我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕是20个像素,对于视网膜屏幕是40个像素,但为了未来证明我的应用程序,我希望能够在没有硬编码值的情况下确定这一点。是否有可能通过编程计算出状态栏的高度?


当前回答

对于iOS 13,你可以使用:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

其他回答

在iOS 13中已弃用UIApplication.shared.statusBarFrame.height

'statusBarFrame'在iOS 13.0中已弃用:改用窗口场景的statusBarManager属性。

在iOS 13中,你可以像下面这样检索状态栏高度:

let statusBarHeight = view.window?.windowScene?.statusBarManager?.statusBarFrame.height

NB !这是可选的,所以要确保你有正确的退路。

下面是一个快速获取屏幕状态栏高度的方法:

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

在我的一个项目https://github.com/goktugyil/EZSwiftExtensions中包含了这些标准函数

试试这个:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

编辑 iOS 11的方法是在哪里放置你的视图内容的顶部是UIView的safeAreaLayoutGuide参见UIView文档。

弃用的答案 如果你的目标是iOS 7+, UIViewController的文档建议viewController的topLayoutGuide属性给你状态栏的底部,或者导航栏的底部,如果它也是可见的。这可能是有用的,而且肯定不像以前的许多解决方案那么hack。

使用以下单行代码,您可以获得状态栏的高度在任何方向,也如果它是可见的或不可见

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

这只是一个简单但非常有用的宏,尝试一下,你不需要写任何额外的代码