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

我知道,目前iPhone / iPad上方的状态栏(包括时间,电池和networking连接)为非视网膜屏幕20像素,视网膜屏幕为40像素,但为了将来validation我的应用,我希望能够确定这个没有硬编码值。 是否有可能计算出状态栏的高度编程?

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

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

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

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

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

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

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

导航栏平铺的背景也平铺到状态栏

与马丁的build议去问题:获取iPhone状态栏高度 。

 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) } 

这看起来像一个黑客,但它实际上是相当稳固。 无论如何,这是唯一的工作解决scheme。

老答案

下面的代码将放在你的UIViewController的自定义子类中,几乎可以支持风景。 但是,我注意到一个angular落的情况下(从右侧>不支持倒置>左转),它不工作(切换高度和宽度)。

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

尝试这个:

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

状态栏通常是20pt高,在某些情况下可能是这个数值的两倍:

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

试试看,你会看到自己。 将高度硬编码为20pt通常会起作用,直到不能。

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

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

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

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

然后你可以直接读取statusBarFrame的height属性。 在这种情况下,“视图”应该是您希望使用测量的视图,很可能是应用程序窗口的根视图控制器。

顺便说一句,在通话过程中,状态栏不仅可能更高,而且状态栏被故意隐藏,也可以为零。

如果您的目标是iOS 7+,UIViewController的文档build议viewController的topLayoutGuide属性为您提供状态栏的底部或导航栏的底部(如果它也是可见的)。 这可能是有用的,肯定比许多以前的解决scheme更less。

Swift 3:

 UIApplication.shared.statusBarFrame.height 

这是一个迅速获取屏幕状态栏高度的方法:

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

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

iOS中的状态栏高度默认为20 pt

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

我只是发现一种方式,让你不能直接访问状态栏的高度,但计算它。

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

迅速:

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

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

使用以下单行代码,您可以在任何方向获取状态栏高度,也可以获取状态栏高度

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

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