如何修复 iOS 7 状态栏高度和宽度问题

Posted

技术标签:

【中文标题】如何修复 iOS 7 状态栏高度和宽度问题【英文标题】:How to fix iOS 7 status bar height and width issue 【发布时间】:2013-11-01 07:31:32 【问题描述】:

我已经制作了一个自定义的 toast 库(非常简单,只是出现在导航栏下的一个框)。这在我的目标群体 ios 6 中运行良好。但是自从 iOS 7 发布后就无法正常显示了。

我尝试修复它的方法是通过以下代码:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7,0"))
    self.offset = [UIApplication sharedApplication].statusBarFrame.size.height + self.viewController.navigationController.navigationBar.frame.size.height;

我做了一个可以在 Stack Overflow 上找到的宏来检测 iOS 版本是否为 7,然后添加状态栏高度和导航高度。这在 iOS 7 的纵向模式下可以正常工作,但是当我切换到横向时,偏移量变为 512?。

谁能解释这种情况发生的方式以及我该如何解决这个问题?


决定拆分代码,因为一个注释,看看究竟是什么造成了差异。我所做的是:

CGFloat statusBarHeight =[UIApplication sharedApplication].statusBarFrame.size.height;

CGFloat navBar = self.viewController.navigationController.navigationBar.frame.size.height;
self.offset = statusBarHeight + navBar;
NSLog(@"Init - statusBarHeight: %f, navBar: %f", statusBarHeight, navBar);

由于某种原因,状态栏是纵向 20,横向是 480


这是因为高度和宽度调转了,答案来自评论

【问题讨论】:

我的猜测是横向 [UIApplication sharedApplication].statusBarFrame.size.width 和 [UIApplication sharedApplication].statusBarFrame.size.height 值被切换 这是真的,谢谢,如果你能发布你的答案我可以接受它 【参考方案1】:

正如我之前做过同样的“修复”,我注意到在横向

[UIApplication sharedApplication].statusBarFrame.size.width  

 [UIApplication sharedApplication].statusBarFrame.size.height  

值被切换。

【讨论】:

此答案不适用于 iOS 8,它会正确报告状态栏的高度。【参考方案2】:

Travis Jeffery 提供了一个很好的解释 http://travisjeffery.com/b/2013/05/using-the-status-bars-frame-in-ios/

让我从他的网站上复制它:

“状态栏框架和高度的技巧是确保你已经将它转换为你关心的视图的坐标空间,这可能是 UIViewController 的视图或子视图。”

CGRect statusBarFrame = [yourView.window convertRect:UIApplication.sharedApplication.statusBarFrame toView:yourView];
CGFloat statusBarHeight = statusBarFrame.size.height;

【讨论】:

【参考方案3】:

另一种方法是使用视图控制器的topLayoutGuide.length,它应该对应于状态栏的高度。

【讨论】:

以上是关于如何修复 iOS 7 状态栏高度和宽度问题的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 iOS 7 中的状态栏重叠问题

iOS 获取状态栏、导航栏、tabBar高度

如何在 iOS 7 中使用 NavigationBar 背景图像 44px 高度更改状态栏背景?

iPhone获取状态栏和导航栏尺寸(宽度和高度)

修复 ios 7 上隐藏状态栏的错误

如何在 iOS 8 上修复横向导航栏项目的高度?