文章目录

  • iPhone 屏幕分辨率终极指南
  • 适配新的 iPhone X 设备
  • 检测 iPhone X/XS/XR 设备的几种方式
    • 方式一:通过获取设备的 device model 来判断
    • 方式二:通过获取屏幕的宽高来判断
    • 方式三:通过底部安全区域的高度来判断
    • 方式四:通过是否支持 FaceID 判断
    • 方式五:通过 UIStatusBar 的高度判断
  • 结语
  • 原文链接
  • 参考连接

本文是我们前两天发的两条小集的汇总,主要包括三部分:

  1. iPhone 屏幕分辨率总结
  2. 如何适配新的 iPhone X 设备
  3. 检测设备是否为 iPhone X/XS/XR 的几种方式

iPhone 屏幕分辨率终极指南

上周,苹果发布了三款新的 iPhone 设备,它们的屏幕数据分别如下:

  1. iPhone XS: 5.8 英寸,375pt * 812pt (@3x);
  2. iPhone XR: 6.1 英寸,414pt * 896pt (@2x);
  3. iPhone XS Max: 6.5 英寸,414pt * 896pt (@3x);

在国外的 PaintCode 网站上,有一篇文章《The Ultimate Guide To iPhone Resolutions》整理了包括从第一代 iPhone 到最新发布的 iPhone XS Max 等所有 iPhone 设备的屏幕数据,包括:开发尺寸(points)、物理尺寸(pixels)以及实际渲染像素、1倍/2倍/3倍模式等,如图 1 所示(建议大图查看更加清晰)。

从图中数据我们可以总结以下几点:

  1. 5.8 英寸的 iPhone X/XS 与 6.1 英寸的 iPhone XR 和 6.5 英寸的 iPhone XS Max 的屏幕宽高比是一致的,约为 0.462;
  2. iPhone X/XS 的屏幕宽度(开发尺寸)与 4.7 英寸的 iPhone 8 相同,都为 375pt,只是在高度上增加了
    145pt;
  3. iPhone XR 和 iPhone XS Max 的屏幕宽度(开发尺寸)与 5.5 英寸 iPhone 8 Plus 相同,都为
    414pt,只是在高度上增加了 160pt;

因此,设计师在出图时,仍然可以以 iPhone 8 和 iPhone 8 Plus 的屏幕宽度为基准分别进行 UI 布局,而对于不同高度的屏幕只要在纵向上进行内容延伸即可。


适配新的 iPhone X 设备

此外,我们发现,对于未进行新屏幕尺寸适配的工程,直接编译,在新设备 iPhone XR 和 iPhone XS Max 上运行,它们是以放大模式自动适配的(以 5.8 寸的 iPhone X 屏幕为基准等比例放大),此时在代码中获取到的屏幕宽高都为 375pt * 812pt。

那么如何正确适配新的屏幕尺寸呢?

  1. 如果你的工程是以 LaunchScreen.storyboard 作为启动页,则只需要在 Xcode 10 下重新编译工程即可;
  2. 如果你的工程是通过配置 Assets.xcassets 里的 LaunchImage 不同尺寸的启动图片作为启动页,则你需要新增两张
    828px * 1792px 和 1242px * 2688px 分辨率的图片,如图 2 所示。

检测 iPhone X/XS/XR 设备的几种方式

最后,我们如何在代码中判断当前设备是否为 iPhone X 呢?

备注:这里所说的 iPhone X 泛指上述介绍的屏幕大小为 5.8、6.1、6.5 英寸三种尺寸,且带有顶部刘海和底部操作条的 iPhone 设备。

一开始我们采用了一种比较简便的方法:通过获取屏幕的高度,判断是否等于 812.0 或 896.0,代码如图 3 所示。

但该方法存在小瑕疵,需要考虑一下两点:

  1. 当 App 支持横竖屏切换时,在横屏模式下也能够正确判断;
  2. 在模拟器中调试时,能够正确判断当前所选则的模拟器类型是不是 iPhone X;

因此,我们重新整理一下目前所了解到的几种检测设备是否为 iPhone X 的方式,供大家参考,不足之处欢迎补充。

方式一:通过获取设备的 device model 来判断

每一台 iOS 设备都有对应的硬件编码/标识符,称为 device model 或者叫 machine name,我们可以通过如下两种方法来获取 device model/machine name。

例如,去年发布的第一代 iPhone X 对应的 device mode 为 iPhone10,3 和 iPhone10,6,而今年最新发布 iPhone XS 对应 iPhone11,2,iPhone XS Max 对应 iPhone11,4 和 iPhone11,6,iPhone XR 对应 iPhone11,8,完整的 device mode 数据参考这里:

  • https://www.theiphonewiki.com/wiki/Models

不过需要注意的是,上述两种获取 device model 的方法在模拟器中运行得到的值为 i386 或 x86_64,因此在模拟器中我们可以通过如下方式正确获取模拟器所对应的 device model:

// 获取模拟器所对应的 device model
NSString *model = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"];

综上,我们可以通过判断 device model 是否为 “iPhone10,3” 和 “iPhone10,6” 或者以 “iPhone11,”(新设备)开头,来检测设备是否为 iPhone X,完整代码如下:

方式二:通过获取屏幕的宽高来判断

正如我们前面讲到,目前 iPhone X 设备的屏幕宽高对应的开发尺寸只有两种,分别为 375pt * 812pt 和 414pt * 896pt,因此我们可以根据屏幕的高度来判断设备是否为 iPhone X。但是此时需要考虑设备处于横屏或者竖屏的情况,这两种情况的宽高刚好是相反的(当然,如果你的 App 不用支持横屏的情况,就相对比较简单了)。

在 UIDevice 中提供了一个 orientation 属性用于获取设备的方向(横向、竖向、或者水平),一开始我们想着先通过这个属性判断设备处于横屏或者竖屏,然后分别取其对应的屏幕宽度(横屏下)或者高度(竖屏下)来判断,但是当这个属性的值为 FaceUp 或者 FaceDown(即设备放在水平面上),我们是无法知道此时设备是处于横屏还是竖屏的。

后面我们想了一个简便的方法,即获取屏幕的宽度和高度,取较大一方进行比较是等于 812.0 或 896.0,代码如下:

方式三:通过底部安全区域的高度来判断

在去年 iPhone X 发布后,为了适配顶部的浏览和底部的操作条,苹果在 iOS 11 上引入安全区域概念,建议开发者在安全区域内进行 UI 布局,因此我们可以获取屏幕 keyWindow 的 safeAreaInsets 值来判断设备是否 iPhone X。

iPhone X 在竖屏下,keyWindow 的 safeAreaInsets 值为:

{top: 44, left: 0, bottom: 34, right: 0}

而在横屏下,其值为:

{top: 0, left: 44, bottom: 21, right: 44}

因此,我们可以比较 safeAreaInsets 的 bottom 是否等于 34.0 或者 21.0 来判断设备是否为 iPhone X,因为其他设备对应的 bottom 横竖屏下都为 0,代码如下:

不过该方式有个不足是,必须在 AppDelegate 的 didFinishLaunchingWithOptions 回调中等 keyWindow 初始化之后才能正确判断。

方式四:通过是否支持 FaceID 判断

由于目前只有 iPhone X 设备支持 FaceID,因此我们也可以通过判断设备是否支持 FaceID 来判断,代码如下:

不足:如果用户禁用 canEvaluatePolicy:error: 方法的使用将无法正确判断,而且在也不适用于模拟器中的判断。

方式五:通过 UIStatusBar 的高度判断

在 iPhone X 之前,所有 iPhone 设备的 StatusBar(状态栏)高度都为 20pt,而 iPhone X 的为 44pt,因此我们可以通过获取状态栏的高度判断是否等于 44.0 来检测设备是否为 iPhone X,代码如下:

不足:该方法只适用于竖屏且显示状态栏的情况下才能正确检测,而在横屏模式下,或者 App 隐藏导航栏时,获取到的状态栏高度都为 0(statusBarFrame 的值为 CGRectZero),就无法判断了。

你是否有其他判断方式呢?欢迎补充~


结语

最后,绝大部分场景,我们需要检测设备是否为 iPhone X 是为了适配顶部的刘海区域和底部的操作条区域,但是这里我们更推荐通过 Auto Layout 结合 Safe Area 进行 UI 布局,以适应越来越复杂的屏幕状况。


原文链接

文中包含大量代码截图,如果你需要复制使用其中代码,请查阅这篇博文:

  • https://kangzubin.com/iphonex-detect/

参考连接

  • The Ultimate Guide To iPhone Resolutions
    https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

  • iPhone X Screen Demystified
    https://www.paintcodeapp.com/news/iphone-x-screen-demystified

  • Detect if the device is iPhone X
    https://stackoverflow.com/questions/46192280/detect-if-the-device-is-iphone-x/

  • iOS Device Model
    https://www.theiphonewiki.com/wiki/Models

iPhone 检测 iPhone X 设备的几种方式和分辨率终极指南相关推荐

  1. iOS机型 iPhone X/XS/XR 判断的5种方式总结

    目前已发布的所有 iPhone 设备的屏幕数据,包括了最新上市的 iPhone XS.iPhone XS Max 和 iPhone XR,请参考<iPhone 屏幕分辨率终极指南>. 最后 ...

  2. 安卓数据转移到iphone老是中断_关于iPhone手机之间数据转移的几种方式

    最近肯定有很多小伙伴已经买了iPhone 11的新机,或者有些打算换一台新iPhone .拿到新机之后转移数据可是一件麻烦的事.关于iPhone手机之间的数据转移有哪几种呢?今天码哥就来跟大家科普一. ...

  3. 【信息图】iPhone屏幕分辨率终极指南

    近日,苹果公司推出了iPhone 6+,新版iPhone的屏幕大幅改变图形的呈现方式,你可以通过下面的信息图去了解一下. 请点击图片查看大图: (查看大图) 原文:paintcodeapp 译:Xon ...

  4. 5.1.3 OS控制I/O设备的几种方式?(程序直接控制方式、中断驱动方式、DMA、通道控制)

    文章目录 0.思维导图 1.程序直接控制方式 2.中断驱动方式 3.DMA方式 4.通道控制方式 5.四种方式总结一下 0.思维导图 1.程序直接控制方式 key word : 轮询 完成一次读/写操 ...

  5. iphone分辨率终极指南(含iphone6/6+)

    如文字不清,请 "右键->图片另存为" 下载后查看大图 ------------------------- 原文及翻译文本 Points 点 At the beginning ...

  6. IOS iPhone开发中发送e-mail的3种方式

    iOS系统框架提供的两种发送Email的方法1.使用openURL来实现发邮件的功能:NSString *url = [NSString stringWithString: @"mailto ...

  7. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)...

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

  8. 连接ARM设备的两种方式

    1. 利用USB串口,可以使用minicom或者putty, 设置好波特率 首先查看一下当前的USB设备有哪些, 通过插拔可以看到以下指令输出的变化,来判断是哪几个USB的串口 ls /dev/tty ...

  9. RK3399驱动开发 | 01 -RK3399 gpio的使用(用户态和设备树两种方式)

    一.RK3399的GPIO RK3399有5组GPIO,GPIO0-GPIO4,每一组GPIO成为一个GPIO bank,每组GPIO包含32个引脚,需要注意,不是所有 bank 都有全部编号,例如 ...

  10. 如何检测iPhone 5(宽屏设备)?

    本文翻译自:How to detect iPhone 5 (widescreen devices)? I've just upgraded to XCode 4.5 GM and found out ...

最新文章

  1. AI一分钟 | 蔚来赴美IPO,开盘跌破发行价;TensorFlow开源新库TFDV
  2. 利用叉乘快速判断点是否在三角形内
  3. 缓存目录的区别getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用
  4. 快速了解AngularJs HTTP响应拦截器
  5. 再见了亲爱的学生们,再见了敬爱的同事们,再见了信狮
  6. iOS CoreImage之滤镜简单使用
  7. 在React中加载数据:redux-thunk,redux-saga,suspense,hooks
  8. 你必须掌握的常用正则表达式大全
  9. Ubuntu14.4安装mysql
  10. C语言基础练习(5)
  11. 北京市海淀区卫星地图离线包下载
  12. 中文如何翻译成英文?手机中英文一键翻译超简单
  13. 【CSS】关键字 -webkit-fill-available 详解
  14. [DP优化之平行四边形不等式]例题
  15. 设计原则 - 单一职责原则
  16. STL 大锅炖(一):什么是 STL
  17. 单测利器——PowerMockito使用心得
  18. h5+css3基础面试题
  19. 50.Spark大型电商项目-用户访问session分析-top10热门品类之本地测试
  20. 微博数据采集API 附咨询公司微博大数据分析实例

热门文章

  1. 【DNS应用案例】智能DNS赋能海运集团全球域名体系建设
  2. python什么情况下要加eval_python 为什么说eval要慎用?使用eval 带来的潜在风险?什么情况下使用eval?...
  3. Kotlin基础知识5
  4. mysql 基数_MySQL 索引基数
  5. 狂神JAVA博客MySQL_狂神说SpringBoot08:整合Druid
  6. monthcalendar控件
  7. [1-5] 把时间当做朋友(李笑来)Chapter 5 【小心所谓成功学】 摘录
  8. 学习语言的方法,你了解几种?
  9. [技术分享 – FCS 篇] 驭龙五式3之飞龙在天:安装 FCS 服务器
  10. 【Python神器】推荐这款傻瓜式GIF制作工具,以后别再说不会了(好用到爆~)