要获取iOS应用程序状态栏的height
,我们执行
let height = UIApplication.shared.statusBarFrame.height
print(height)
,这会在正常情况下返回20.0
。
如果状态栏由于通话中或个人热点条件而展开,则会返回40.0
。
现在让我们说我们有一个内置NavigationController
的{{1}}。我们试图找出集合视图的UICollectionView
指向的位置。
contentOffset
使用正常状态栏,结果为:
contentOffset:(0.0,-64.0)
statusBarHeight:20.0
意味着let contentOffset = self.collectionView!.contentOffset
let statusBarHeight = UIApplication.shared.statusBarFrame.height
的身高为NavigationBar
。
随着状态栏的扩展:
contentOffset:(0.0,-64.0)
statusBarHeight:40.0
请注意,contentOffset仍然是64.0
,但不是(0.0, -64.0)
。这意味着扩展状态栏后面有无法访问的空间。而且我相信我们无法确定无法访问的空间的实际大小。
我们只能猜测它是(0.0, -84.0)
,因为我们在实践中已经知道了这个数字。
因此,我们想在状态栏下方绘制一个漂亮的视图。但是使用20.0
给出的信息,我们不能这样做,因为整个视图会缩小我们不知道的魔法 20px的高度。
如果我们要放置框架statusBarHeight
的视图,如果状态栏处于正常状态,则会将其放置在状态栏的正下方。但是,如果状态栏的已展开,则会失败,因为现在(0, statusBarHeight, 100, 100)
为statusBarHeight
。
现在我们必须添加幻数,如下所示:
40
所以我的问题是:
我们如何计算这个幻数?
答案 0 :(得分:2)
您的app委托可以实现以下方法:
-application:willChangeStatusBarFrame:
-application:didChangeStatusBarFrame:
并且这些本地通知也将发送到默认通知中心:
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
您可以转到statusBarHeight
获取计算幻数