如何以编程方式获取iOS状态栏高度
我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕为20像素,对于视网膜屏幕为40像素,但为了证明我的应用程序的可靠性,我希望能够在没有硬编码值的情况下确定这一点。是否可以通过编程方式计算状态栏的高度?[code>[UIApplication sharedApplication].statusBarFrame.size.height。但由于所有大小都以点为单位,而不是以像素为单位,因此状态栏高度始终等于20 更新。看到这个答案被认为有帮助,我应该详细说明 状态栏高度实际上等于20.0f点,以下情况除外:如何以编程方式获取iOS状态栏高度,ios,uikit,retina-display,Ios,Uikit,Retina Display,我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕为20像素,对于视网膜屏幕为40像素,但为了证明我的应用程序的可靠性,我希望能够在没有硬编码值的情况下确定这一点。是否可以通过编程方式计算状态栏的高度?[code>[UIApplication sharedApplication].statusBarFrame.size.height。但由于所有大小都以点为单位,而不是以像素为单位,因此状态栏高度始终等于20 更新。看到这个答案被认为有帮助,我应该详细说明 状
- 状态栏已使用
方法隐藏,其高度等于0.0f点李>setStatusBarHidden:withAnimation:
- 正如@Anton在此指出的,在电话应用程序之外的来电期间或录音会话期间,状态栏高度等于40.0f点
[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或类似应用程序在后台使用麦克风时李>
- 当个人热点被激活时李>
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