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


当前回答

试试这个:

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

其他回答

我刚刚找到了一种方法,允许您不直接访问状态栏高度,而是计算它。

导航栏高度- topLayoutGuide长度=状态栏高度

迅速:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.length是半透明栏覆盖的顶部区域,self.navigationController?. navigationbar .frame.height是除去状态栏的半透明栏,通常是44pt。因此,通过使用这种方法,您可以很容易地计算状态栏高度,而不用担心状态栏高度因电话呼叫而变化。

UIApplication sharedApplication .statusBarFrame.size.height。但是因为所有的大小都是以点为单位,而不是像素,所以状态栏的高度总是等于20。

更新。鉴于这个答案被认为是有帮助的,我应该详细说明。

状态栏高度确实等于20.0f点,除了以下情况:

状态栏已经被setStatusBarHidden:withAnimation:方法隐藏,它的高度等于0.0f点; 正如@Anton指出的那样,在电话应用程序之外的来电或录音会话期间,状态栏高度等于40.0f点。

还有一种情况是状态栏会影响视图的高度。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。然而,如果你在视图显示后动画状态栏(显示或隐藏它),状态栏将改变它的帧,但视图不会,你必须手动调整视图大小在状态栏动画之后(或在动画期间,因为状态栏高度设置为动画开始时的最终值)。

Update 2. There's also a case of user interface orientation. Status bar does not respect the orientation value, thus status bar height value for portrait mode is [UIApplication sharedApplication].statusBarFrame.size.height (yes, default orientation is always portrait, no matter what your app info.plist says), for landscape - [UIApplication sharedApplication].statusBarFrame.size.width. To determine UI's current orientation when outside of UIViewController and self.interfaceOrientation is not available, use [UIApplication sharedApplication].statusBarOrientation.

iOS7更新。即使状态栏的视觉风格改变了,它仍然在那里,它的框架仍然表现相同。关于状态栏我唯一有趣的发现——我分享:你的UINavigationBar的平铺背景也会平铺到状态栏,所以你可以实现一些有趣的设计效果,或者只是给你的状态栏上色。这也不会以任何方式影响状态栏的高度。

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

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

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

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

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

    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }

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

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

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