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

时间:2012-10-20 19:33:44

标签: ios uikit retina-display

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

14 个答案:

答案 0 :(得分:495)

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

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

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

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

还有一个状态栏会影响视图的高度。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。但是,如果在显示视图后为状态栏(显示或隐藏)设置动画,状态栏将更改其框架,但视图将不会,您必须在状态后手动调整视图大小条形动画(或动画期间,因为状态栏高度在动画开始时设置为最终值)。

更新2。还有一个用户界面方向的情况。状态栏不考虑方向值,因此纵向模式的状态栏高度值为[UIApplication sharedApplication].statusBarFrame.size.height(是的,默认方向始终为纵向,无论您的app info.plist说明了什么), landscape - [UIApplication sharedApplication].statusBarFrame.size.width。要在UIViewControllerself.interfaceOrientation之外无法确定用户界面的当前方向,请使用[UIApplication sharedApplication].statusBarOrientation

更新iOS7。即使状态栏视觉样式发生了变化,它仍然存在,但它的帧仍然表现相同。关于我获得的状态栏的唯一有趣的发现 - 我分享:你的UINavigationBar平铺背景也将平铺到状态栏,这样你就可以实现一些有趣的设计效果或只是为你的颜色着色状态栏。这也不会以任何方式影响状态栏高度。

Navigation bar tiled background is also tiled to status bar

答案 1 :(得分:92)

使用Martin's suggestion to the question: Get iPhone Status Bar Height

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

在Swift中

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

这似乎是一个黑客,但它实际上非常可靠。无论如何,这是唯一可行的解​​决方案。

旧答案

以下代码将放在UIViewController的自定义子类中,几乎可以支持格局。但是,我注意到一个角落的情况(当从右边旋转>不支持颠倒>左)时它不起作用(切换高度和宽度)。

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

答案 2 :(得分:21)

试试这个:

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

答案 3 :(得分:14)

Swift 3或Swift 4:

UIApplication.shared.statusBarFrame.height

答案 4 :(得分:10)

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

  • 当你正在打电话时(这是一种非常常见的情况);
  • 当录音机,Skype或类似的应用程序在后台使用麦克风时;
  • 个人热点被激活时;

试试吧,你会亲眼看到。将高度硬编码到20pt通常会起作用,直到它没有。

所以我是H2CO3的第二个答案:

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

答案 5 :(得分:9)

修改 iOS 11的方法来确定视图内容的顶部位置是UIView的safeAreaLayoutGuide请参阅UIView Documentation

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

答案 6 :(得分:5)

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

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

然后,您可以直接读取statusBarFrame的height属性。此实例中的“视图”应该是您希望使用测量的视图,很可能是应用程序窗口的根视图控制器。

顺便提一下,在电话呼叫期间,状态栏不仅可能更高,如果故意隐藏状态栏,状态栏也可能为零。

答案 7 :(得分:1)

UIApplication.shared.statusBarFrame.heightiOS 13

中已弃用 <块引用>

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

您可以在 iOS 13 中检索状态栏高度,如下所示:

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

注意!它是可选的,因此请确保您有正确的回退。

答案 8 :(得分:0)

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

更多信息:http://www.idev101.com/code/User_Interface/sizes.html

答案 9 :(得分:0)

我刚刚找到了一种方法,可以让你不直接访问状态栏高度,但计算它。

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

夫特:

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

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

答案 10 :(得分:0)

对于iOS 13,您可以使用:

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

答案 11 :(得分:0)

    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
    }

答案 12 :(得分:0)

快捷键5

UIApplication.shared.statusBarFrame.height

答案 13 :(得分:-5)

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

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

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