我的代码我的坑(十三) —— 状态栏高度的动态计算(一)

版本记录

版本号 时间
V1.0 2021.04.11 星期日

前言

做了好几个APP,碰到了大大小小的很多坑,以前碰到坑,解决了就结束了,这里想把自己碰到的坑记录下来,一来给自己备查二来希望可以帮助到大家。感兴趣的可以关注下,也欢迎大家补充留言,感兴趣的看上面几篇文章。
1. 我的代码我的坑(一) —— 自签名证书导致请求取消的问题(一)
2. 我的代码我的坑(二) —— UIImageView动画点击后动画和图片消失的问题(一)
3. 我的代码我的坑(三) —— iOS9系统WKWebView加载页面白板的问题(一)
4. 我的代码我的坑(四) —— iOS12系统自定义渐变色UISwitch手机横屏的异常问题(一)
5. 我的代码我的坑(五) —— 不可编辑状态的UITextView文本高度大于视图高度默认滚动到底部的问题(一)
6. 我的代码我的坑(六) —— UITextField输入长度自动截取时汉字和拼音带来的末位截取不能正常输入汉字的问题(一)
7. 我的代码我的坑(七) —— UIImageView做序列帧动画结束后没有回调并且“隐藏”(一)
8. 我的代码我的坑(八) —— iOS 13.1.2 Debug调试模式系统layoutSubviews中修改frame循环调用导致的崩溃(一)
9. 我的代码我的坑(九) —— 系统键盘拼音全键无法正常联想以及输入汉字高亮区识别不计入长度计数的问题(一)
10. 我的代码我的坑(十) —— iOS9 Xib实例化的UITableViewCell中UIButton和UISwitch等控件的IBAction点击无响应的问题(一)
11. 我的代码我的坑(十一) —— macOS Mojave 和 xcode 11.1 (11A1027)环境下运行iphonex以上流海屏xcode install时xocde崩溃闪退的问题(一)
12. 我的代码我的坑(十二) —— iOS10字体DIN Condense Bold字体显示不全顶部被切割的问题(一)

问题描述

自从17年iphoneX出现以后,以前状态栏都是写死的20iphoneX的状态栏高度为44。以为就到此为止了,但是随着机型越来越多,不同机型和系统的状态栏高度不再是44或者20,而是有更多不同的高度,比如说:

  • iphone 11手机iOS 14.3系统状态栏高度是48
  • iphone 12手机iOS 14系统状态栏的高度是44
  • iphone 12mini手机 iOS 14.1系统状态栏的高度是50

问题解决

由于有上面的几个问题,所以以后这种状态栏的计算就不能在用宏定义枚举进行取值了,最好的方案就是通过系统的API进行取值,直接读取状态栏的高度。

具体实现方案有很多,其中一种可以是写一个UIDevice的一个分类,在里面进行处理。

- (BOOL)isLiuHaiScreen {
    if (@available(iOS 11.0, *)) {
        return UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIApplication.sharedApplication.delegate.window.safeAreaInsets.bottom > 0.0;
    } else {
        return NO;
    }
}
+ (CGFloat)getStatusBarHeight{
    CGFloat statusBarHeight = 0.0;
    // 注意:状态栏隐藏的时候,此方式获取的高度为0
    if (@available(iOS 13.0, *)) {
        statusBarHeight = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
    } else {
        statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    }
     
    if (statusBarHeight <= 0) {
        if (@available(iOS 11.0, *)) {
            UIWindow *window = [UIApplication sharedApplication].windows.firstObject;
            if ([window respondsToSelector:@selector(safeAreaInsets)]) {
                statusBarHeight = window.safeAreaInsets.top;
            }
        }
    }
    
    //这个是兜底的,做保护
    if (statusBarHeight <= 0) {
        statusBarHeight = [self currentDevice].isLiuHaiScreen ? 44 : 20;
    }
    
    return statusBarHeight;
}

后记

本篇主要讲述了状态栏高度的动态计算,感兴趣的给个赞或者关注~~~

你可能感兴趣的:(我的代码我的坑(十三) —— 状态栏高度的动态计算(一))