1、问题出现的根源是,获取 「状态栏+导航栏高度」的方法采用的是类似于下面的判断是否为刘海屏,然后返回固定值的写法。
// 状态栏高度,iPhoneX 是判断是否为刘海屏
#define StatusBar_Height (iPhoneX ? 44.0f : 20.0f)
现在早些时间,这种方法确实是没错的,但是在 iOS 14 系统之后,刘海屏手机的状态栏高度就不再统一是 44 了。下表是 iOS 15.2 上各刘海屏机型的状态栏高度,其中 iPhone 13 系列和 iPhone 12 系列是一致的,就不再重复列举。
2、利用系统方法获取状态栏高度
因为上面那种写死的方法已经不能满足我们的需求了,于是我们采用系统的方法来获取。在 iOS 13.0 之前,我们可以通过 UIApplication 单例中的 statusBarFrame 属性获取状态状态栏改度,代码如下:
[UIApplication sharedApplication].statusBarFrame.size.height;
但是在 iOS 13.0 之后,UIApplication 单例中的 statusBarFrame 属性被废弃⚠️了。官方希望能我们使用 UIStatusBarManager 类中的 statusBarFrame 熟悉来进行获取,代码如下:
if (@available(iOS 13.0, *)) {
NSSet *set = [UIApplication sharedApplication].connectedScenes;
UIWindowScene *windowScene = [set anyObject];
UIStatusBarManager *statusBarManager = windowScene.statusBarManager;
return statusBarManager.statusBarFrame.size.height;
}