iOS 26 获取statusBarHeight遇到的问题

问题:

由于iOS 26在 ScrollView 增加了虚化的边界
导致我的部分UI被虚化部分遮挡了。
其实这个获取高度的代码造成的
以前我们获取高度 但是这里灵动岛会有问题

旧代码
+ (CGFloat)statusBarHeight {
    CGFloat statusBarHeight = 0;
    if (@available(iOS 13.0, *)) {
        UIStatusBarManager *statusBarManager = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager;
        statusBarHeight = statusBarManager.statusBarFrame.size.height;
    } else {
        statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
    }
    return statusBarHeight;
}

这里的返回值是 statusBarHeight = 54

正确来说 iOS16以后 灵动岛应该返回59

原因:

在iOS16 +
灵动岛机型上系统的 statusBarFrame 返回值 不是视觉上的实际高度,而是系统 API 认为的状态栏高度,通常是 54pt。
iOS 16 以后(灵动岛机型),statusBarFrame 不再等于顶部安全区高度,灵动岛区域比状态栏大,真实可用的顶部安全区(safeAreaInsets.top)更高。
所以我们需要用 safeAreaInsets.top 来获取顶部区域高度,而不是 statusBarFrame。
所以我们修改代码

修改后:

/// 顶部状态栏高度(包括安全区)
+ (CGFloat)AQ_statusBarHeight {
    CGFloat height = 0;
    if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.windows.firstObject;
        height = window.safeAreaInsets.top;  // 顶部安全区高度,灵动岛可达 59
    } else {
        height = [UIApplication sharedApplication].statusBarFrame.size.height;
    }
    return height;
}

/// 导航栏高度
+ (CGFloat)AQ_navigationBarHeight {
    return 44.0f;
}

/// 状态栏+导航栏的高度
+ (CGFloat)AQ_navigationFullHeight {
    return [UIDevice aq_statusBarHeight] + [UIDevice AQ_navigationBarHeight];
}

好,今日bug结束。
接下来的的任务,手机必须电充满,尿尿必须尿到清澈! 主打一个去公司添乱。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容