我是靠谱客的博主 舒适冰淇淋,最近开发中收集的这篇文章主要介绍iOS - iPhone手机刘海屏判断前言刘海屏判断相关常用宏 (deprecated ⚠️ )参考资料,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2022.04.11 更新,修改获取 iPhone 状态栏、导航栏、TabBar高度等部分内容。


前言

最近写毕业设计的时候,发现 iPhoneX 之后的刘海屏手机顶部状态栏高度底部TabBar高度和原来不一样了,这就需要我们对刘海屏手机做单独的 UI 布局适配了。

刘海屏判断

适配的核心是要对刘海屏进行判断,以下针对刘海屏手机的特征,提供了两种判断方法。

1. 安全区底部边距判断法

在 iOS 11 之后,多了安全区(下图蓝色区域)的概念。刘海屏手机因为多了下方的小黑条,底部安全区存在距离屏幕底部的边距,而且这是非刘海屏所不具有的
safe_area
因此,我们可以将其作为判断刘海屏的依据。如果系统大于 iOS 11 且安全区底部到屏幕底部存在间距,就将其判断为刘海屏。代码如下:

// 刘海屏判断
#define iPhoneX ({ 
    BOOL iPhoneX = NO; 
    if (@available(iOS 11.0, *)) { 
        if ([UIApplication sharedApplication].windows[0].safeAreaInsets.bottom > 0) { 
            iPhoneX = YES; 
        } 
    } 
    iPhoneX; 
})

2. 屏幕宽高比判断法

考虑到我不太喜欢写这种多行宏定义,据说会降低编译速度。我又继续寻找其他刘海屏的特征,终于在下面这一张图中找到了灵感。
在这里插入图片描述
由上图所示,但凡是刘海屏手机,屏幕的纵横比都是 19 : 9

设手机屏幕宽度为 W i d t h Width Width,高度为 H e i g h t Height Height。根据屏幕纵横比规律,它只要满足以下两个条件其中一个,我们就能判它是刘海屏。
∣ H e i g h t W i d t h − 812 375 ∣ < 0.01 |frac{Height}{Width} - frac{812}{375}| < 0.01 WidthHeight375812<0.01

∣ H e i g h t W i d t h − 896 414 ∣ < 0.01 |frac{Height}{Width} - frac{896}{414}| < 0.01 WidthHeight414896<0.01

代码如下:

// 刘海屏判断
#define iPhoneX (ABS(MAX(CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)) / MIN(CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)) - 896 / 414.0) < 0.01 || ABS(MAX(CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)) / MIN(CGRectGetWidth([UIScreen mainScreen].bounds), CGRectGetHeight([UIScreen mainScreen].bounds)) - 812 / 375.0) < 0.01)

PS:用小于 0.01 是为了避免精度问题,以及 iPhone 12 系列和前面刘海屏手机的纵横比存在一定误差。

相关常用宏 (deprecated ⚠️ )

既然有了刘海屏的判断, 后面的工作就变得简单起来了。下面是我在编写相关代码的时候所写的宏,有需要的同学可以参考一下。

// 屏幕宽度
#define ScreenWidth [UIScreen mainScreen].bounds.size.width

// 屏幕高度
#define ScreenHeight [UIScreen mainScreen].bounds.size.height

// 状态栏高度 (deprecated)
#define StatusBar_Height (iPhoneX ? 44.0f : 20.0f)

// 导航栏高度 (deprecated)
#define NaviBar_Height (44.0f)

// 状态栏+导航栏高度 (deprecated)
#define StatusBar_NaviBar_Height (StatusBar_Height + NaviBar_Height)

// TabBar高度 (deprecated)
#define TabBar_Height (iPhoneX ? 49.0f + 34.0f : 49.0f)

以上内容已经不能成为通用的方法了,如果依旧有需要的话,可以看一篇「iOS 准确获取 iPhone 状态栏、导航栏、TabBar高度,看这篇就够了」。

参考资料

  • 官方文档:Adaptivity and Layout
  • https://www.jianshu.com/p/392489853d92
  • https://www.strerr.com/screen.html

最后

以上就是舒适冰淇淋为你收集整理的iOS - iPhone手机刘海屏判断前言刘海屏判断相关常用宏 (deprecated ⚠️ )参考资料的全部内容,希望文章能够帮你解决iOS - iPhone手机刘海屏判断前言刘海屏判断相关常用宏 (deprecated ⚠️ )参考资料所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部