我需要调整一些与iPhone状态栏高度相关的元素。我知道状态栏通常是20点高,但当它处于网络共享模式时不是这种情况。它被加倍到40.确定它的高度的正确方法是什么?我试过了
[[UIApplication sharedApplication] statusBarFrame]
但它给了我20 x 480的景观,这是正确的,但它给我320 x 40的肖像。为什么不给我相反的(40 x 320)?
答案 0 :(得分:80)
statusBarFrame以屏幕坐标返回帧。我相信在视图坐标中获得对应的正确方法是执行以下操作:
- (CGRect)statusBarFrameViewRect:(UIView*)view
{
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil];
CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil];
return statusBarViewRect;
}
现在在大多数情况下,窗口使用与屏幕相同的坐标,因此[UIWindow convertRect:fromWindow:]
不会改变任何内容,但如果它们可能不同,则此方法应该做正确的事情。
答案 1 :(得分:15)
你这样做了吗?
CGRect rect;
rect = [[UIApplication sharedApplication] statusBarFrame];
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
答案 2 :(得分:6)
此方法适用于肖像和&景观定位。
-(float) statusBarHeight
{
CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
return MIN(statusBarSize.width, statusBarSize.height);
}
// example call
float statusBarHeight = [self statusBarHeight];
答案 3 :(得分:6)
修改强>
iOS 11的方法是弄清楚视图内容的顶部位置是UIView的safeAreaLayoutGuide
请参阅UIView Documentation。
弃用的答案
如果您的目标是iOS 7+,UIViewController的文档会建议viewController的topLayoutGuide
属性为您提供状态栏的底部,或者导航栏的底部,如果它是&#39 ; s也可见。这可能是有用的,并且肯定比以前的许多解决方案都少了。
答案 4 :(得分:5)
您可以测试哪两个值中的较小值,即实际高度。
答案 5 :(得分:3)
Swift 2:
let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height
Swift 3或Swift 4:
let statusBarHeight = UIApplication.shared.statusBarFrame.height
建议:不要忘记注入UIApplication.shared
,不要只在代码中使用单例。
答案 6 :(得分:0)
如果有人需要,这是Swift版本:
var screenStatusBarHeight: CGFloat {
return UIApplication.sharedApplication().statusBarFrame.height
}
这包含在以下标准变量中:
https://github.com/goktugyil/EZSwiftExtensions
免责声明:我的回购