我需要调整一些与iPhone状态栏高度相关的元素.我知道状态栏通常是20点高,但当它处于网络共享模式时不是这种情况.它被加倍到40.确定它的高度的正确方法是什么?我试过了
[[UIApplication sharedApplication] statusBarFrame]
Run Code Online (Sandbox Code Playgroud)
但它给了我20 x 480的景观,这是正确的,但它给了我320 x 40的肖像.它为什么不给我相反的(40 x 320)?
Tho*_*asW 81
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;
}
Run Code Online (Sandbox Code Playgroud)
现在在大多数情况下,窗口使用与屏幕相同的坐标,因此[UIWindow convertRect:fromWindow:]
不会改变任何内容,但是如果它们可能不同,则此方法应该做正确的事情.
o15*_*1s2 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);
Run Code Online (Sandbox Code Playgroud)
此方法适用于纵向和横向.
-(float) statusBarHeight
{
CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
return MIN(statusBarSize.width, statusBarSize.height);
}
// example call
float statusBarHeight = [self statusBarHeight];
Run Code Online (Sandbox Code Playgroud)
编辑
iOS 11的方法来确定视图内容的顶部位置是UIView的safeAreaLayoutGuide
See UIView Documentation.
弃用答案
如果您的目标是iOS 7+,UIViewController的文档会建议viewController的topLayoutGuide
属性为您提供状态栏的底部,或导航栏的底部,如果它也可见.这可能是有用的,并且肯定比以前的许多解决方案都少.
小智 5
斯威夫特 2:
let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height
Run Code Online (Sandbox Code Playgroud)
斯威夫特 3 或斯威夫特 4:
let statusBarHeight = UIApplication.shared.statusBarFrame.height
Run Code Online (Sandbox Code Playgroud)
建议:不要忘记UIApplication.shared
在代码中注入不要只使用单例。