5

我制作了一个自定义 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


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

4

3 回答 3

12

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

[UIApplication sharedApplication].statusBarFrame.size.width  

 [UIApplication sharedApplication].statusBarFrame.size.height  

值被切换。

于 2013-10-23T09:39:32.120 回答
7

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;
于 2014-04-22T20:39:54.647 回答
2

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

于 2014-12-08T23:50:29.220 回答