iOS开发 关于iPhone X 的适配
友情链接:XCODE 9:最新功能详尽介绍
1.屏幕尺寸相关变化
- 高度增加了145pt,变成812pt.
- 屏幕圆角显示,注意至少留10pt边距。
- 状态栏高度由20pt变成44pt,留意这个距离就能避开“刘海”的尴尬,相应的导航栏以上变化64->88。
- 底部工具栏需要为home indicator留出34pt边距。
- 物理分辨率为1125px * 2436px.
2.横竖屏安全区对比
3.其他设备安全区域对比
4.应用设计
5.控件布局
更多可查看官方文档和视频Creating apps for iPhone X.
如何让APP适配?
APP启动样式适配
相信有一部分道友的APP在iPhone X上运行时并没有像想象中那样占满整个屏幕, 而是保持着原有的高度 在屏幕中心位置, 针对这个问题 目前经过实验得出可以通过以下方式使APP按照全屏模式运行:
- 通过
LaunchScreen.storyboard
方式启动 - 如果使用的是Assets中的LaunchImage, 在增加了iPhone X尺寸的图片配置后.
LaunchScreen.storyboard
方式不用多说, 这里说一下如何在LaunchImage中增加iPhone X尺寸的图片配置.
准备一张尺寸:1125 * 2436的启动图片, 移动到LaunchImage的Finder目录中, 并在LaunchImage中的Contents.json
文件中增加 (注意Json格式):
{"extent" : "full-screen","idiom" : "iphone","subtype" : "2436h","filename" : "图片名.png","minimum-system-version" : "11.0","orientation" : "portrait","scale" : "3x"
}
按照以上方式配置就完全解决了这个问题.
APP内部样式适配
iOS11为UIViewController
和UIView
增加了两个新的属性safeAreaInsets
和safeAreaLayoutGuide
, 通过这两个属性我们可以获得安全区域的范围, 通过上图可以很清楚的看到安全区域的范围, 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示, 注意!这句话非常重要.
safeAreaInsets
适用于手动计算.safeAreaLayoutGuide
适用于自动布局.
Frame布局方式适配示例
一般来说 可以通过在原有视图坐标计算时加入安全区域的范围值, 下面举个例子:
一个APP 它的NavigationBar使用的是自定义的UIView
, 并非UINavigationBar
, 这个自定义的UIView
的frame
属性为CGRectMake(0, 0, 375, 64)
.
这样的UIView
在其他设备上是没有问题的, 标准的导航栏尺寸, 但是如果运行在iPhone X上 你会发现看上去无比的别扭, 因为异形屏幕会造成部分显示内容的遮挡问题, 这时候就要用到安全区域这个概念来解决这一问题.
先说一说通常自定义导航栏的结构, 高度是为64
由44
高度的导航栏内容区域和20
高度的状态栏区域(电池条那部分 status bar)组成, 44
高度的导航栏内容区域用来显示导航栏上的控件, 如返回按钮 标题视图等等, 现在, 在iPhone X上, 原来的状态栏(status bar)高度不再考虑了, 取而代之的是安全区域顶部间距safeAreaInsets.top
, 我们将原有的结构改为 安全区域顶部距离屏幕的距离safeAreaInsets.top
+ 导航栏内容区域44
, 这样完成了一个自定义导航栏视图在iPhone X上的适配.
下面是适配前后的效果对比:
再来看一下适配后的自定义导航栏视图的UI结构
这只是举一个简单的例子, 因为不同的应用设计都是不同的, 但是适配的思路都是一样的, 还是那句话 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示, 在计算布局时 将安全区域这个新特性考虑进去, iPhone X的适配也不是难事.
说一下在代码中的安全区域的适配该如何去写:
iOS11 为UIViewController
和UIView
增加了一个新的方法 - (void)viewSafeAreaInsetsDidChange;
这个方法如名字一样 在安全区域改变后会被调用, 我们可以在需要适配的UIViewController
和UIView
中重写这个方法, 并且在这个方法中来根据safeAreaInsets
属性更新子视图控件的布局位置.
这里有一点要注意的是当UIViewController
调用- (void)viewDidLoad
时它的所有子视图的safeAreaInsets
属性都等于UIEdgeInsetsZero
, 也就是说在- (void)viewSafeAreaInsetsDidChange;
方法调用前 是无法通过当前视图控制器的子视图获取到safeAreaInsets
的, 不过获取当前window对象的safeAreaInsets
属性用来计算也是可以的, 但是不建议这么做, 一个视图控制器的子视图的处理当然要以它所在的控制器为准.
- (void)viewSafeAreaInsetsDidChange
在UIViewController
中第一次调用的时间是在- (void)viewWillAppear:(BOOL)animated
调用之后, 在- (void)viewWillLayoutSubviews
调用之前.
当然如果你要改变一个UIViewController
的safeAreaInsets
值, 可以通过设置addtionalSafeAreaInsets
属性来实现, 例如你要自定义一些特殊的样式时.
如果你改变了一个UIViewController
的safeAreaInsets
属性值, - (void)viewSafeAreaInsetsDidChange
也会被调用.
另外, 给道友们的分享一个获取某View安全区域范围的宏
#define VIEWSAFEAREAINSETS(view) ({UIEdgeInsets i; if(@available(iOS 11.0, *)) {i = view.safeAreaInsets;} else {i = UIEdgeInsetsZero;} i;})
使用起来比较简洁
VIEWSAFEAREAINSETS(view).leftVIEWSAFEAREAINSETS(self.view).right
AutoLayout布局方式示例
iOS11以前,我们布局时, 视图的 top
和 bottom
一般参照的是 Top Layout Guide
和 Bottom Layout Guide
.
iOS11以后, 那两个参照已经 deprecated
(过时)了, 而是被Safe Area
所取代.
参考自官方文档
总结
还是那句话 我们要做的是让那些不能被遮挡的内容和控件在安全区域范围内显示.
感谢LEE
iOS开发 关于iPhone X 的适配相关推荐
- IOS开发基础之屏幕组件适配添加约束
IOS开发基础之屏幕组件适配添加约束 使得横屏显示也能自动适配 对齐我们可以按住Ctrl键,把控件连线至view中 如果我们不小心添加错了.可以清除掉约束 具体约束可以在右边查看 by johnson ...
- html5开发之ios屏幕适配,iOS开发屏幕尺寸以及屏幕适配等问题(转载内容)
原帖地址:http://blog.csdn.net/phunxm/article/details/42174937/ 仅供我个人收藏学习,原博主如不同意请联系qq651263878进行删除,在此表示感 ...
- 我常去的ios开发论坛/iphone开发论坛
1. Devdiv 综合性的移动开发社区,android/ios/windows phone都很有人气,其中人气最旺的是ios 虽然帖子不是最多的,但是人气是最旺的,版主非常热情 [url]http: ...
- ios 更新尺寸调用什么方法_iOS开发:iPhone尺寸和适配
1:iPhone尺寸规格 尺寸表格:1 inch(英寸) = 2.54cm = 25.4mm 2:屏幕尺寸 我们通常所说的iPhone5屏幕尺寸为4英寸.iPhone6屏幕尺寸为4.7英寸,指的是显示 ...
- iOS开发:iPhone设备图片、音乐、视频获取实践
背景介绍 出于项目需求,需要基于iphone设备内图片及音乐.视频资源完成一些功能.功能包括以几点:1.需要在APP内获得并处理iphone设备内的图片.音频和视频:2.在APP内嵌入拍照入口,可以拍 ...
- iOS开发:iPhone分辨率指南
转载自:http://blog.csdn.net/cuibo1123/article/details/39405973 ------------------------- 原文及翻译文本 Points ...
- iOS开发所有iPhone型号中所有键盘类型的高度
4s几近淘汰,未收录 高度值其实就只有两种类型,一个是Default一个是Number ①以下几种键盘类型几乎一样,键盘高度也是一样的 UIKeyboardTypeAlphabet UIKeyboar ...
- iOS开发罗盘/指南针
iphone开发/ios开发编程罗盘/指南针开发 (2012-06-08 15:51:08) 转载▼ 标签: iphone开发罗盘 ios开发指南针 iphone指南针 ios指南针罗盘 指南针开 ...
- iOS开发适配iPhone X 齐刘海处理,代码适配iPhoneX
我的简书新地址,欢迎点击查看哦~ 今天手头工作完事了,然后升级了Xcode9,变化很大啊,先说大家一直关心的适配齐刘海吧. 这个东西好像出来之后 我QQ群里面iOS开发的很多人都炸了.确实这个齐刘海对 ...
最新文章
- R语言计算回归模型学生化残差(Studentized Residuals)实战:如果样本学生化残差(Studentized Residuals)绝对值大于3则是离群值
- 基于 Bitbucket Pipeline + Amazon S3 的自动化运维体系
- Python数据库字段拆分数据
- uva-10602-贪心
- sklearn线性回归详解
- 基本矩阵运算的Java实现
- python oracle blob_如何用python在oracle中插入blob?
- hooks组件封装 react_react-hooks amp; context 编写可复用react组件的一种实践
- 目标检测——如何让模型过拟合
- 如果一个国家是一种颜色,中国的颜色美哭了!
- 高质量的用户体验 推进IT运维向业务服务转变——中国移动通信集团公司
- atitit 指令集概论原理导论 艾提拉著 目录 2. 2.3 CISC和RISC 复杂指令集	1 1. 指令集(IA:InstructionSet)是指CPU指令系统所能识别(翻译)执行的全部指令
- 二项分布期望和方差的公式推导
- Vue中解决数据量过大导致页面崩溃;解决方案
- chmod 777 到底是啥 ???看完这个你就完全懂了!
- B7 HTML5期末大作业:海贼王影视网站设计——仿京东-海贼王(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 wweb前端期末大作业 网页设计实例 企业网站制作
- QQ自由幻想刺客加点
- SCOM2019安装监控代理
- Mysql Order By 与 Group By
- 如何解决 Android浏览器查看背景图片模糊的问题?
热门文章
- NPDP知识推送-第七章产品生周期管理(3)
- 2021年计算机类 人工智能 软件SCI一区期刊
- 一大法器-----正则表达式
- linux中dd命令详解,Linux基础知识之dd命令详解
- 1万用户的虚拟服务器,10万用户用什么虚拟主机
- 联想小新+Windows10+Ubuntu18.04双系统安装+引导设置过程全记录
- Python自学笔记6:实操案例三(十进制转换二、八、十六进制),手机充值,计算能量消耗,预测未来子女身高
- matlab非对心弹性斜碰,一种倾斜撞击的实验装置
- Bot Chat(聊天机器人) HeroCard的简单用法
- 实验三 XSS和SQL注入