了解隐藏在状态栏中的幻数

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)的视图,如果状态栏处于正常状态,它将被放置在状态栏的正下方。但是如果状态栏展开,这将失败,因为现在statusBarHeight40

现在我们必须添加 幻数,如下所示:

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/…

以上是关于了解隐藏在状态栏中的幻数的主要内容,如果未能解决你的问题,请参考以下文章

在状态栏中隐藏活动指示器[重复]

如何隐藏或删除Apple Watch状态栏中的时间?

如何在状态栏中隐藏 url 地址? [复制]

导航栏中的 SwiftUI 元素不响应状态

内存分配中的幻数[关闭]

qwt 中的幻数