iOS——判断刘海屏

news/2024/10/16 16:54:35/

在写项目时,发现在非刘海屏型号的iPhone上测试的UI界面,有时候在刘海屏iPhone会被遮挡。这时候,我们需要判断当前设备是否是刘海屏,以来对UI代码做相应的适配,以下是学习的几种方案。

判断手机型号

iPhone的发展历史中,手机屏幕从来不是一尘不变的。从home键非全面屏到取消home键刘海屏,苹果公司一直在屏幕上做改变。并且不只是屏幕,耳机孔、按键等也在不断发生变化。所以在目标机型是所有iPhone的iOS开发中,判断手机型号是必要的。下面是判断手机型号的步骤。

引入头文件,声明类方法

#import <UIKit/UIKit.h>
#import <sys/utsname.h>@interface ViewController : UIViewController+ (NSString*)judgeIphoneType;@end

实现类方法

+ (NSString*)judgeIphoneType {struct utsname systemInfo;uname(&systemInfo);NSString * phoneType = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];// simulator 模拟器if ([phoneType isEqualToString:@"i386"]) {return @"Simulator";}if ([phoneType isEqualToString:@"x86_64"]) {return @"Simulator";}//  常用机型  不需要的可自行删除if([phoneType  isEqualToString:@"iPhone1,1"]) {return @"iPhone 2G";}if([phoneType  isEqualToString:@"iPhone1,2"]) {return @"iPhone 3G";}if([phoneType  isEqualToString:@"iPhone2,1"]) {return @"iPhone 3GS";}if([phoneType  isEqualToString:@"iPhone3,1"]) {return @"iPhone 4";}if([phoneType  isEqualToString:@"iPhone3,2"]) {return @"iPhone 4";}if([phoneType  isEqualToString:@"iPhone3,3"]) {return @"iPhone 4";}if([phoneType  isEqualToString:@"iPhone4,1"]) {return @"iPhone 4S";}if([phoneType  isEqualToString:@"iPhone5,1"]) {return @"iPhone 5";}if([phoneType  isEqualToString:@"iPhone5,2"]) {return @"iPhone 5";}if([phoneType  isEqualToString:@"iPhone5,3"]) {return @"iPhone 5c";}if([phoneType  isEqualToString:@"iPhone5,4"]) {return @"iPhone 5c";}if([phoneType  isEqualToString:@"iPhone6,1"]) {return @"iPhone 5s";}if([phoneType  isEqualToString:@"iPhone6,2"]) {return @"iPhone 5s";}if([phoneType  isEqualToString:@"iPhone7,1"]) {return @"iPhone 6 Plus";}if([phoneType  isEqualToString:@"iPhone7,2"]) {return @"iPhone 6";}if([phoneType  isEqualToString:@"iPhone8,1"]) {return @"iPhone 6s";}if([phoneType  isEqualToString:@"iPhone8,2"]) {return @"iPhone 6s Plus";}if([phoneType  isEqualToString:@"iPhone8,4"]) {return @"iPhone SE";}if([phoneType  isEqualToString:@"iPhone9,1"]) {return @"iPhone 7";}if([phoneType  isEqualToString:@"iPhone9,2"]) {return @"iPhone 7 Plus";}if([phoneType  isEqualToString:@"iPhone10,1"]) {return @"iPhone 8";}if([phoneType  isEqualToString:@"iPhone10,4"]) {return @"iPhone 8";}if([phoneType  isEqualToString:@"iPhone10,2"]) {return @"iPhone 8 Plus";}if([phoneType  isEqualToString:@"iPhone10,5"]) {return @"iPhone 8 Plus";}if([phoneType  isEqualToString:@"iPhone10,3"]) {return @"iPhone X";}if([phoneType  isEqualToString:@"iPhone10,6"]) {return @"iPhone X";}if([phoneType  isEqualToString:@"iPhone11,8"]) {return @"iPhone XR";}if([phoneType  isEqualToString:@"iPhone11,2"]) {return @"iPhone XS";}if([phoneType  isEqualToString:@"iPhone11,4"]) {return @"iPhone XS Max";}if([phoneType  isEqualToString:@"iPhone11,6"]) {return @"iPhone XS Max";}if([phoneType  isEqualToString:@"iPhone12,1"]) {return @"iPhone 11";}if ([phoneType isEqualToString:@"iPhone12,3"]) {return @"iPhone 11 Pro";}if ([phoneType isEqualToString:@"iPhone12,5"]) {return @"iPhone 11 Pro Max";}if ([phoneType isEqualToString:@"iPhone12,8"]) {return @"iPhone SE2";}if ([phoneType isEqualToString:@"iPhone13,1"]) {return @"iPhone 12 mini";}if ([phoneType isEqualToString:@"iPhone13,2"]) {return @"iPhone 12";}if ([phoneType isEqualToString:@"iPhone13,3"]) {return @"iPhone 12  Pro";}if ([phoneType isEqualToString:@"iPhone13,4"]) {return @"iPhone 12  Pro Max";}if ([phoneType isEqualToString:@"iPhone14,4"]) {return @"iPhone 13 mini";}if ([phoneType isEqualToString:@"iPhone14,5"]) {return @"iPhone 13";}if ([phoneType isEqualToString:@"iPhone14,2"]) {return @"iPhone 13  Pro";}if ([phoneType isEqualToString:@"iPhone14,3"]) {return @"iPhone 13  Pro Max";}return phoneType;}

关于iPhone的phoneType,在网站 theiphonewiki 可以查到。

通过当前视图的 Safe Area 位置判断

因为iPhone X外形与往代iPhone的变化,iOS 11 中引入了 Safe Area (安全区)这个概念,并且建议我们不要把任何交互放在 Safe Area 之外。
请添加图片描述

利用 Safe Area,我们可以简单的判断当前机型是否是刘海屏。

if (UIApplication.sharedApplication.keyWindow.safeAreaInsets.top > 20) {NSLog(@"是刘海屏");
} else {NSLog(@"不是刘海屏");
}

通过状态栏高度判断

通过状态栏高度判断是否是刘海屏,与通过 Safe Area 判断差不多。但它的好处是不用调用keyWindow,在SDK开发中更广适。

if ([[UIApplication sharedApplication] statusBarFrame].size.height > 20) {NSLog(@"是刘海屏");
}else{NSLog(@"不是刘海屏");
}

http://www.ppmy.cn/news/192225.html

相关文章

Android 浅谈适配全面屏、刘海屏、水滴屏

对刘海屏、水滴屏做适配前&#xff0c;先在此给出一个基本概念&#xff1a;何谓刘海屏&#xff1f;何谓水滴屏&#xff1f; 上述两种屏幕都可以统称为刘海屏&#xff0c;不过对于右侧较小的刘海&#xff0c;业界一般称为水滴屏或美人尖。 目前国内流行的手机厂商主要有&#x…

android兼容小米xiaomi刘海屏解决方案

引用自小米官方文档&#xff0c;这里缩减了一些内容&#xff0c;捡取重要内容。 转载请标明出处&#xff1a; https://blog.csdn.net/DJY1992/article/details/80688376 本文出自:【奥特曼超人的博客】 推荐&#xff1a; android 兼容所有刘海屏的方案大全android 兼容huaw…

Android刘海屏、水滴屏全面屏适配详解,androidui基础教程

适配方式 适配方式有两种&#xff1a; 将targetSdkVersion版本设置到API 24及以上&#xff1b; 这个操作将会为<application> 标签隐式添加一个属性&#xff0c;android:resizeableActivity“true”, 该属性的作用后面将详细说明。 在 标签中增加属性&#xff1a;and…

Android刘海屏、水滴屏全面屏适配详解大厂直通车!

为什么想跳槽&#xff1f; 简单说一下当时的状况&#xff0c;我在这家公司做了两年多&#xff0c;这两年多完成了一个大项目&#xff0c;作为开发的核心主力&#xff0c;开发压力很大&#xff0c;特别是项目上线前的几个月是非常辛苦&#xff0c;几乎每晚都要加班到12点以后&a…

Android适配全面屏/刘海屏

目前国内厂商已经推出的刘海屏Android手机有华为P20 pro&#xff0c; vivo X21&#xff0c;OPPO R15。 1.华为刘海屏的官方适配文档 https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114 2.oppo刘海屏官方文档&#xff1a; https://open.oppomobile.com/…

浅谈Maven依赖冲突与依赖管理

目录 什么是依赖冲突 为什么会产生冲突 依赖冲突的解决和避免 Maven的仲裁机制

网络安全真的那么好吗?

当你开始在网上搜索关于网络安全的学习资料&#xff0c;常常会陷入自我怀疑&#xff1a;尝试自学后能使用工具进行简单的扫描和挖洞&#xff0c;但总感觉后期学习很难有突破&#xff0c;不知道是哪里出现问题…于是又不得不推倒重来。 了解网络安全&#xff0c;首先要搞清楚下…

django-vue-admin使用

一、源码地址 注意&#xff0c;一定要使用这个地址。&#xff08;使用其他地址下载下来的感觉代码缺失&#xff0c;踩了大坑&#xff09; django-vue-admin: 基于RBAC模型的权限控制的一整套基础开发平台&#xff0c;前后端分离&#xff0c;后端采用 djangodjango-rest-frame…