了解隐藏在状态栏中的幻数
Posted
技术标签:
【中文标题】了解隐藏在状态栏中的幻数【英文标题】:Understanding the magic number hidden in the statusbar 【发布时间】:2018-03-01 05:16:18 【问题描述】:要获取ios应用状态栏的height
,我们这样做
let height = UIApplication.shared.statusBarFrame.height
print(height)
这会在正常情况下返回20.0
。
如果状态栏因通话中或个人热点情况而扩展,则返回40.0
。
现在让我们说我们有一个 NavigationController
和一个 UICollectionView
内置。我们正在尝试找出集合视图的contentOffset
指向的位置。
let contentOffset = self.collectionView!.contentOffset
let statusBarHeight = UIApplication.shared.statusBarFrame.height
使用正常的状态栏,结果是:
contentOffset: (0.0, -64.0)
状态栏高度:20.0
意思是NavigationBar
的高度是64.0
。
并带有扩展状态栏:
contentOffset: (0.0, -64.0)
状态栏高度:40.0
注意 contentOffset 仍然是 (0.0, -64.0)
但不是 (0.0, -84.0)
。这意味着在展开的状态栏后面有无法访问的空间。而且我相信我们无法计算出这个无法到达的空间的实际大小。
我们只能猜测它是20.0
,因为我们在实践中已经知道这个数字。
假设我们想在状态栏的正下方绘制一个漂亮的视图。但是使用statusBarHeight
提供的信息,我们不能这样做,因为整个视图会将其高度缩小神奇 20px,这是我们不知道的。
如果我们想放置一个框架(0, statusBarHeight, 100, 100)
的视图,如果状态栏处于正常状态,它将被放置在状态栏的正下方。但是如果状态栏展开,这将失败,因为现在statusBarHeight
是40
。
现在我们必须添加 幻数,如下所示:
myView.frame = CGRect(x: 0, y: statusBarHeight - 20, width: 100, height: 100)
所以我的问题是:
我们如何计算这个幻数?
【问题讨论】:
【参考方案1】:您的应用委托可以实现这些方法:
-application:willChangeStatusBarFrame:
-application:didChangeStatusBarFrame:
这些本地通知也会发送到默认通知中心:
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
这里你去statusBarHeight
计算幻数
更多请查看Get notification status Bar Height change
【讨论】:
是的,这些方法将为您提供有关when
的信息,是否发生此更改,如果展开,高度将为 40.0
。但我想知道整个视图的高度缩小了多少,不是 40.0,而是 20.0。
您是否测试了状态栏 20 但未打印的任何内容。例如录音或其他任何东西。更多检查这个***.com/questions/3888517/…以上是关于了解隐藏在状态栏中的幻数的主要内容,如果未能解决你的问题,请参考以下文章