OC/Swift 技术 获取状态栏的高度(正确方法)

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

2020年10后 iOS13出现之后,修改了获取导航栏的方式。今天说一下如何准确的获取到状态栏的高度。

正题

Swift获取方法

我们可以自己新建一个文件出来,做一个静态属性在获取的地方把它存起来。
例如:创建一个结构体模型OC/Swift 技术 获取状态栏的高度(正确方法)_第1张图片
OC/Swift 技术 获取状态栏的高度(正确方法)_第2张图片

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let scene = (scene as? UIWindowScene) else { return }
        
        Device.statusBarHeight = scene.statusBarManager?.statusBarFrame.height ?? 0.0

注意:

在网上搜索很多方法都是类似下面的获取方法是不行的。

/// 状态栏高度
public static var statusBarHeight: CGFloat {
    if #available(iOS 13.0, *) {
        let window: UIWindow? = UIApplication.shared.windows.first
        return (window?.windowScene?.statusBarManager?.statusBarFrame.height) ?? 0
    } 
}

OC/Swift 技术 获取状态栏的高度(正确方法)_第3张图片
这个方法不是不行,是不准确,在开发的需求中,有时候使用它的时候,获取回来为0
这个跟App启动的生命周期的时机有关。
例如下面的例子


然后布局的时候就像下面的方法获取状态栏的告诉是不行的,结果打印出来的结果是0
OC/Swift 技术 获取状态栏的高度(正确方法)_第4张图片
因为获取的方法写死了第一个win
OC/Swift 技术 获取状态栏的高度(正确方法)_第5张图片
之后App启动之后,在SceneDelegate 里面,才确定当前是哪个win,才会准确获取状态栏的高度,就像下面的图片
OC/Swift 技术 获取状态栏的高度(正确方法)_第6张图片
上面的BUG只是做个记录。

OC获取方法

新建一个项目的时候 现在App启动入口,变成在SceneDelegate 启动,那么我们可以在SceneDelegate获取状态栏的高度:
在这里插入图片描述
可以用一个全局属性(静态属性)把它存起来在整个项目里面去用。

如果想旧的项目,在AppDelegate的didFinishLaunchingWithOptions作为入口,可以这样获取状态的高度
在这里插入图片描述
这样就搞定了。

注意:

网上很多文章获取ios13的状态栏高度都想下面的图片这样写
OC/Swift 技术 获取状态栏的高度(正确方法)_第7张图片
这个sindows.first的不准确的,不一定是first,这样的话有可能获取不到。

获取在iOS 13之前OC开发很多人用宏定义去获取状态。
在这里插入图片描述
这个方法在iOS 13之后不适用

你可能感兴趣的:(技术分享,swift,ios,objective-c)