前言
最近在iPhone 12 系列机型上开发项目时,发现使用项目提供的获取状态栏、导航栏高度方法获取到的高度是错误的,随后跟踪排查最终解决这个问题,所以自己想简单的总结一下问题原因和解决办法。
本文主要介绍问题原因和解决办法,最终提供一个能准确获取iPhone 状态栏、导航栏、TabBar高度的方法。
问题原因
出现问题的原因是,我们大多开发在使用获取状态栏、导航栏高度方法都是以下方法来获取的:
在iOS 14系统以前,使用这种方法获取是没有问题的,但是在之后,刘海屏的手机状态栏高度就不在是统一的44px咯,根据下表我们看一看目前iOS 15系统上的各机型的状态栏高度:
使用系统方法获取状态栏高度
可以看出使用上面方法已经不在满足我们的开发需求了,于是我就想到使用系统提供的方法来获取,通过UIApplication单例中的statusBarFrame属性获取状态状态栏改度:
我发现 iOS 13.0系统 之后,UIApplication 单例中的 statusBarFrame 属性被废弃了。不建议使用了,系统希望我们使用 UIStatusBarManager 类中的 statusBarFrame 来进行获取:
代码模块
为了统一和方便快速获取系统顶部和底部安全区、顶部状态栏和导航栏、底部 tabBar,我将新建一个分类来实现这些方法,方便项目全局引用:
在UIDevice+StateHeight.h中,声明各方法名称:
在 UIDevice+StateHeight.m 中实现各方法进行。