如何以编程方式获取iOS状态栏高度

如何以编程方式获取iOS状态栏高度,ios,uikit,retina-display,Ios,Uikit,Retina Display,我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕为20像素,对于视网膜屏幕为40像素,但为了证明我的应用程序的可靠性,我希望能够在没有硬编码值的情况下确定这一点。是否可以通过编程方式计算状态栏的高度?[code>[UIApplication sharedApplication].statusBarFrame.size.height。但由于所有大小都以点为单位,而不是以像素为单位,因此状态栏高度始终等于20 更新。看到这个答案被认为有帮助,我应该详细说明 状

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

[code>[UIApplication sharedApplication].statusBarFrame.size.height。但由于所有大小都以点为单位,而不是以像素为单位,因此状态栏高度始终等于20

更新。看到这个答案被认为有帮助,我应该详细说明

状态栏高度实际上等于20.0f点,以下情况除外:

  • 状态栏已使用
    setStatusBarHidden:withAnimation:
    方法隐藏,其高度等于0.0f点
  • 正如@Anton在此指出的,在电话应用程序之外的来电期间或录音会话期间,状态栏高度等于40.0f点
还存在状态栏影响视图高度的情况。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。但是,如果在显示视图后设置状态栏动画(显示或隐藏),状态栏将更改其帧,但视图不会更改,则在状态栏动画之后(或在动画期间),必须手动调整视图的大小,因为状态栏高度在动画开始时设置为最终值

更新2。还有一个面向用户界面的案例。状态栏不考虑方向值,因此纵向模式的状态栏高度值为
[UIApplication sharedApplication].statusBarFrame.size.height
(是的,默认方向始终为纵向,无论应用程序info.plist说什么),横向模式为
[UIApplication sharedApplication].statusBarFrame.size.width
。若要在
UIViewController
self.interfaceOrientation
不可用时确定UI的当前方向,请使用
[UIApplication sharedApplication].statusBarOrientation

更新iOS7。即使状态栏视觉样式已更改,它仍然存在,其框架的行为仍然相同。我得到的关于状态栏的唯一有趣的发现——我分享:你的
UINavigationBar
的平铺背景也将平铺到状态栏,因此你可以实现一些有趣的设计效果,或者只是给状态栏上色。这也不会以任何方式影响状态栏的高度

试试这个:

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

虽然状态栏通常为20磅高,但在某些情况下,它可能是该值的两倍:

    当你在打电话的时候(这是一个非常常见的情况);<李>
  • 当录音机、Skype或类似应用程序在后台使用麦克风时
  • 当个人热点被激活时
试试看,你自己会明白的。将高度硬编码到20磅通常会起作用,直到它不起作用为止

所以我支持H2CO3的答案:

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

不要忘记,状态栏的框架将位于屏幕的坐标空间中!如果以横向模式启动,您可能会发现宽度和高度已交换。如果您支持横向,我强烈建议您使用此版本的代码:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];
然后可以直接读取statusBarFrame的height属性此实例中的“视图”应该是您希望在其中使用度量的视图,很可能是应用程序窗口的根视图控制器

顺便说一句,在打电话时,状态栏不仅可能更高,而且如果故意隐藏状态栏,状态栏也可能为零。

请继续

迅速地

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}
这看起来像一个黑客,但实际上它是相当可靠的。无论如何,这是唯一有效的解决方案

旧答案 下面的代码将放在您的自定义子类
UIViewController
中,几乎可以支持横向。但是,我注意到一个角落的情况下(当旋转从右>不支持倒置>左),它没有工作(切换高度和宽度)


默认情况下,iOS中的状态栏高度为
20 pt


更多信息:

使用以下单行代码,您可以获得任何方向的状态栏高度,以及它是否可见

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)
这只是一个简单但非常有用的宏,只需尝试一下,您无需编写任何额外的代码

编辑 计算视图内容顶部位置的iOS 11方法是UIView的
安全区域布局指南
请参阅

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

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

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

斯威夫特:

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

self.topLayoutGuide.length
是半透明条覆盖的顶部区域,
self.navigationController?.navigationBar.frame.height
是半透明条,不包括状态条,通常为44pt。因此,通过使用此方法,您可以轻松计算状态栏高度,而无需担心由于电话呼叫而导致的状态栏高度变化。

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

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

这些功能作为标准功能包含在矿山项目中:

Swift 3或Swift 4:

UIApplication.shared.statusBarFrame.height

对于iOS 13,您可以使用:

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

Swift 5

UIApplication.shared.statusBarFrame.height

UIApplication.shared.statusBarFrame.height
在iOS 13中被弃用 "地位",
UIApplication.shared.statusBarFrame.height
UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    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
    }
let statusBarHeight = view.window?.windowScene?.statusBarManager?.statusBarFrame.height