我知道目前iPhone/iPad顶部的状态栏(包括时间、电池和网络连接)对于非视网膜屏幕是20个像素,对于视网膜屏幕是40个像素,但为了未来证明我的应用程序,我希望能够在没有硬编码值的情况下确定这一点。是否有可能通过编程计算出状态栏的高度?
当前回答
按照Martin的建议:获取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)
}
看起来像黑客,但实际上很结实。不管怎样,这是唯一可行的解决方案。
旧的答案
下面的代码,会放在UIViewController的自定义子类中,几乎可以支持横向视图。但是,我注意到一个角落的情况(当旋转从右>不支持颠倒>左),它不起作用(切换高度和宽度)。
BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
其他回答
对于iOS 13,你可以使用:
UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
UIApplication sharedApplication .statusBarFrame.size.height。但是因为所有的大小都是以点为单位,而不是像素,所以状态栏的高度总是等于20。
更新。鉴于这个答案被认为是有帮助的,我应该详细说明。
状态栏高度确实等于20.0f点,除了以下情况:
状态栏已经被setStatusBarHidden:withAnimation:方法隐藏,它的高度等于0.0f点; 正如@Anton指出的那样,在电话应用程序之外的来电或录音会话期间,状态栏高度等于40.0f点。
还有一种情况是状态栏会影响视图的高度。通常,视图的高度等于给定方向的屏幕尺寸减去状态栏高度。然而,如果你在视图显示后动画状态栏(显示或隐藏它),状态栏将改变它的帧,但视图不会,你必须手动调整视图大小在状态栏动画之后(或在动画期间,因为状态栏高度设置为动画开始时的最终值)。
Update 2. There's also a case of user interface orientation. Status bar does not respect the orientation value, thus status bar height value for portrait mode is [UIApplication sharedApplication].statusBarFrame.size.height (yes, default orientation is always portrait, no matter what your app info.plist says), for landscape - [UIApplication sharedApplication].statusBarFrame.size.width. To determine UI's current orientation when outside of UIViewController and self.interfaceOrientation is not available, use [UIApplication sharedApplication].statusBarOrientation.
iOS7更新。即使状态栏的视觉风格改变了,它仍然在那里,它的框架仍然表现相同。关于状态栏我唯一有趣的发现——我分享:你的UINavigationBar的平铺背景也会平铺到状态栏,所以你可以实现一些有趣的设计效果,或者只是给你的状态栏上色。这也不会以任何方式影响状态栏的高度。
按照Martin的建议:获取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)
}
看起来像黑客,但实际上很结实。不管怎样,这是唯一可行的解决方案。
旧的答案
下面的代码,会放在UIViewController的自定义子类中,几乎可以支持横向视图。但是,我注意到一个角落的情况(当旋转从右>不支持颠倒>左),它不起作用(切换高度和宽度)。
BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
使用以下单行代码,您可以获得状态栏的高度在任何方向,也如果它是可见的或不可见
#define STATUS_BAR_HIGHT (
[UIApplicationsharedApplication].statusBarHidden ? 0 : (
[UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
[UIApplicationsharedApplication].statusBarFrame.size.width :
[UIApplicationsharedApplication].statusBarFrame.size.height
)
)
这只是一个简单但非常有用的宏,尝试一下,你不需要写任何额外的代码
下面是一个快速获取屏幕状态栏高度的方法:
var screenStatusBarHeight: CGFloat {
return UIApplication.sharedApplication().statusBarFrame.height
}
在我的一个项目https://github.com/goktugyil/EZSwiftExtensions中包含了这些标准函数
推荐文章
- 如何删除默认的导航栏空间在SwiftUI导航视图
- 如何在iOS中使用Swift编程segue
- Swift -整数转换为小时/分钟/秒
- Swift:声明一个空字典
- 在成功提交我的应用程序后,“太多符号文件”
- 首先添加一个UIView,甚至是导航栏
- 我如何改变UIButton标题颜色?
- 在Swift中如何调用GCD主线程上的参数方法?
- NSLayoutConstraints是可动画的吗?
- iOS -构建失败,CocoaPods无法找到头文件
- CFNetwork SSLHandshake iOS 9失败
- 请求失败:不可接受的内容类型:文本/html使用AFNetworking 2.0
- 缺少推荐的图标文件-该包不包含iPhone / iPod Touch的应用程序图标,像素为“120x120”,png格式
- 以编程方式创建segue
- 如何使用Xcode创建。ipa文件?