如何以编程方式获取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
。 要在UIViewController
和self.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,只是试试这个,你不需要写任何额外的代码