Answers:
[UIApplication sharedApplication].statusBarFrame.size.height
。但是由于所有尺寸均以点为单位,而不是以像素为单位,因此状态栏的高度始终等于20。
更新。看到这个答案被认为是有帮助的,我应该详细说明。
实际上,状态栏的高度等于20.0f点,以下情况除外:
setStatusBarHidden:withAnimation:
方法隐藏,其高度等于0.0f点;状态栏还会影响视图的高度。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。但是,如果在显示视图后为状态栏设置动画(显示或隐藏),则状态栏将更改其框架,而视图不会更改,则必须在状态栏动画之后(或在状态栏高度在动画开始时设置为最终值)。
更新2。还有一种面向用户界面的情况。状态栏不考虑方向值,因此,对于横向 - ,纵向模式下的状态栏高度值为[UIApplication sharedApplication].statusBarFrame.size.height
(是,默认方向始终为纵向,无论您的应用程序info.plist说什么)。要确定不在和不可用时UI的当前方向,请使用。[UIApplication sharedApplication].statusBarFrame.size.width
UIViewController
self.interfaceOrientation
[UIApplication sharedApplication].statusBarOrientation
iOS7更新。即使状态栏的视觉样式发生了变化,它仍然存在,其框架的行为仍然相同。我分享的关于状态栏的唯一有趣发现-我分享:您UINavigationBar
的平铺背景也会平铺到状态栏,因此您可以实现一些有趣的设计效果,也可以只为状态栏着色。这也不会以任何方式影响状态栏的高度。
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)
}
看起来很hack,但实际上非常可靠。无论如何,这是唯一可行的解决方案。
以下代码将包含在您的的自定义子类中UIViewController
,几乎可以支持景观。但是,我注意到一个转角盒(当从右旋转>无支撑的上下颠倒>向左旋转时)对它不起作用(切换高度和宽度)。
BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
statusBarFrame
返回,作为转换前的值。
var statusBarHeight: CGFloat
虽然状态栏通常高20pt,但在某些情况下可能是该值的两倍:
尝试一下,您会发现自己的。将高度硬编码为20pt通常会起作用,直到无效为止。
因此,我第二次使用H2CO3:
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
编辑
iOS 11找出放置视图内容顶部的方式是UIView的safeAreaLayoutGuide
See UIView Documentation。
弃用的答案
如果您的目标是iOS 7+,则UIViewController的文档建议viewController的topLayoutGuide
属性为您提供状态栏的底部或导航栏的底部(如果它也是可见的)。这可能是有用的,并且肯定比许多以前的解决方案要少。
不要忘记状态栏的框架将在屏幕的坐标空间中!如果以横向模式启动,则可能会发现宽度和高度已交换。如果支持横向,我强烈建议您使用此版本的代码:
CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];
然后,您可以直接读取statusBarFrame的height属性。在这种情况下,“视图”应该是您希望在其中使用度量的视图,很可能是应用程序窗口的根视图控制器。
顺便说一句,状态栏不仅在通话过程中更高,如果故意隐藏状态栏,状态栏也可以为零。
这是一种获取屏幕状态栏高度的快捷方法:
var screenStatusBarHeight: CGFloat {
return UIApplication.sharedApplication().statusBarFrame.height
}
这些作为标准功能包含在我的项目中:https : //github.com/goktugyil/EZSwiftExtensions
对于iOS 13,您可以使用:
UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
默认情况下,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。因此,通过使用此方法,您可以轻松计算状态栏的高度,而不必担心由于电话而导致状态栏的高度发生变化。
self.topLayoutGuide.length
为0,因此结果最终为-44。
使用以下单行代码,您可以获取任何方向的状态栏高度,以及是否可见
#define STATUS_BAR_HIGHT (
[UIApplicationsharedApplication].statusBarHidden ? 0 : (
[UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
[UIApplicationsharedApplication].statusBarFrame.size.width :
[UIApplicationsharedApplication].statusBarFrame.size.height
)
)
它只是一个简单但非常有用的宏,只需尝试一下即可,无需编写任何其他代码