IOS学习——iphone X的适配
说实话,对于一个刚入门iOS两个月的新手而言,在拿到这个任务的时候整个人都是懵逼的,怎么做适配?哪些地方需要适配?该怎么做?一个个问题搞得头都大了。
首先,啥都不管,先在iPhone X上运行起来看看效果在说,运行之后出现的问题主要有如下几个:
- 屏幕尺寸还是6S上的尺寸大小,用 [[UIScreen mainScreen] bounds] 打印log确实如此
- 自定义的导航栏的返回按钮右移明显
- UISearchBar的高度有变化,而且点击之后背景颜色和原先不一致
- UITableview的header高度变大,有的地方会出现空白cell格
- UITableview出现的位置不对
- 某些控件的相对位置不对
粗略发现这些变化问题之后,思考一下,主要问题分为两类:一是iPhone X的屏幕尺寸变化带来的变化,二是iOS 11新特性引起的问题。iPhone X屏幕尺寸的变化主要出现在屏幕的头部和底部,头部设置了导航栏,基本没有出现什么问题,尾部主要就是某些控件的位置出现变化,可能是因为设置的相对位置是相对view的mas_bottom设置的(项目中是纯代码布局,使用AutoLayout框架Masonry进行布局),这一块的问题很少,也很简单,改变一下相对位置的值看看效果就ok。那么剩下的问题应该就是因为iOS 11新特性的问题。因此,首先我们就需要好好研究一下iOS 11有那些新特性,在项目中会出现什么样的变化呢?
了解iOS 11新特性的方法很多,网上也有很多解析的博客文档,但是最直接最准确的学习方法就是看官方文档:Human Interface Guidelines ,这个文档中介绍了iOS 11的新特性,还有iPhone X的变化和特点都有所介绍,大家可以参考一下,下面我主要列举一下跟界面相关的新特性,jut8大家也可以参考下面的一些博客的分析链接:
- 导航栏变化,大号字体的变化,iOS 11之前的导航栏高度是64px,其中状态栏的高度是20px,iOS 11中状态栏的盖度是44px。
- 底部tabBar的高度变化,iOS 11中底部tabBar的高度由之前的49px变为83px,增高了34px。
- 提出了safeArea的概念,新概念。
关于iPhone X、iOS 11 、Xcode9,我们应该知道这些
了解完iOS 11的新特性之后,接着就分析上面出现的问题的原因与适配方法。
- 屏幕尺寸还是6S上的尺寸大小,用[[UIScreen mainScreen] bounds]打印log确实如此
这个的主要问题就在于没有适配iPhone X的启动页,如果你的项目中没有自定义的启动页则无所谓,否则要进行适配。设置方法是选中Images.xcassets中的LaunchImage,右边选中图片右上角红框中iOS8.0 and later下面的勾,然后就会出现图片左上角红框内关于iPhone X的启动页的空白框。然后将切好的iPhone X的启动页的图(这个图要先放进Images.xcassets中)拖进图片左上角箭头所指的框中就可以了。By the way,启动页的图的大小一般是按照iPhone X的大小来切,具体尺寸在上面提到的官网有说到,就是:1125px × 2436px (375pt × 812pt @3x),如果还有导航页、广告页也基本上都可以按照这个尺寸来切图。
2. 自定义的导航栏的返回按钮右移明显
iOS 11改动相当大的就是导航栏的部分,除了新加入了largeTitles和searchController两个新特性,还对导航栏的图层结构进行了调整,在原来的已经复杂的不要的图层中又新增了新的图层!是的你没有看错,_UINavigationBarContentView和_UIButtonBarStackView和_UITAMICAdaptorView 而我们之前的leftBarButtonItem什么的现在都在UIButtonBarStackView中了。
<_UIButtonBarStackView: 0x7ff988074290; frame = ( ; ); layer = <CALayer: 0x60000042bc80>>
Printing description of $:
<UIView: 0x7ff9880764a0; frame = ( ; ); layer = <CALayer: 0x60000042b7c0>>
Printing description of $:
<_UITAMICAdaptorView: 0x7ff988076790; frame = ( ; ); autoresizesSubviews = NO; layer = <CALayer: 0x60000042b8a0>>
我们可以看到一个_UIButtonBarStackView占掉了12个像素的左边约束,_UITAMICAdaptorView又占据了8个像素的左边约束,所以说我们很无语的就被占据了20px,更可气的是,都是私有对象,不容易修改!这也就是为什么我们的返回键的位置会右移的原因了。
为了解决这一问题,直接通过 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: backButton]; 将自定义的按钮Button赋值给self.navigationItem.leftBarButtonItem,则其而位置由系统确定,则会出现上面的右移的情况。我们知道,Button中其实是由一个UIImage和一个UILabel组成的,然后我们可以通过contentEdgeInsets、imageEdgeInsets、titleEdgeInsets来设置button本身、button中的图片以及button中的label的相对位置,这个相对位置是相对初始位置而言的,所以我们这里只需要对自定义的button进行这三个值的设定就可以解决按钮右移的问题了,具体向左偏移量可以自己设置。效果图如下图所示,左边是修复前,右边是修复后的图。
//自定义button按钮
CLBackButton *backButton = [CLBackButton createBackButtnWithPopVc:returnTitle]; //ios11 返回按钮右移 适配
if (@available(iOS 11.0, *)) {
backButton.contentEdgeInsets = UIEdgeInsetsMake(, -,, );
backButton.imageEdgeInsets = UIEdgeInsetsMake(, -,, );
backButton.titleEdgeInsets = UIEdgeInsetsMake(, -,, );
} //将自定义的按钮添加到返回键上
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: backButton];
3. UISearchBar的高度有变化,而且点击之后背景颜色和原先不一致
上图右边图是点击搜索框之前和点击结束输入后正常情况下的效果,左边图是iOS 11下点击点击结束输入后的效果。因为在这里项目中并没有对搜索栏进行自定义或者修改参数,但是iPhone X的自带系统软件中搜索点击之后很正常,所以猜测很可能是默认布局的一些参数被修改了。参看项目源代码,发现我们对setExtendedLayoutIncludesOpaqueBars进行了设置为YES。这个参数的设置会有什么影响呢?ExtendedLayoutIncludesOpaqueBars参数的含义是不透明的导航栏条下是否可以扩展,默认是NO,如果设为YES,则表示可以扩展,即可能会受到导航栏的影响,我们知道在iOS 11中导航栏的变化非常大。所以试了一下将其设置为NO之后的效果,还真是。。。适配代码如下:
//适配iOS 11的搜索栏点击之后颜色变化问题
if (@available(iOS 11.0, *)) {
[self setExtendedLayoutIncludesOpaqueBars:NO];
}else{
[self setExtendedLayoutIncludesOpaqueBars:YES];
}
虽然问题解决了,但是岁这个参数还是了解不够,后面自己查了一些资料,觉得这一篇博客写的比较直观,感兴趣的可以看下:与导航栏下控件的frame相关的edgesForExtendedLayout、translucent、extendedLayoutIncludesOpaqueBars、automaticallyAdjustsScrollViewInsets等几个属性的详解
4. UITableview的header高度变大,有的地方会出现空白cell格
iOS 11中对UITableview的改变也是蛮大的,原本的automaticallyAdjustsScrollViewInsets竟然过期了,在IOS 11下 APPLE推荐使用UIScrollView的contentInsetAdjustmentBehavior属性进行设置自动计算滚动视图的内容边距。 并且在iOS 11中如果没有重写header、footer的height和view函数,iOS 11中系统不会像之前那样自动调用。所以出现空白cell格的原因应该就是缺少footer的height和view函数,加上就没什么问题了。这个就不放图了,很简单
5. UITableview出现的位置不对
和问题4中的问题一样,都是UITableview的问题,主要原因还是iOS 11中automaticallyAdjustsScrollViewInsets过期了,加上导航栏的高度的变化和safeArea的概念的提出,使得UITableview在iOS 11的布局上会出现一些偏差,因为涉及到项目信息,所以就不放图了。解决方案如下
//ios11 tableview 适配
if (@available(iOS 11.0, *)) {
if ([self.tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}
IOS学习——iphone X的适配的更多相关文章
- ios学习--iphone 实现下拉菜单
原文地址:ios学习--iphone 实现下拉菜单作者:sdglyuan00 #import @interface DropDown1 : UIView <</span>UITabl ...
- IOS学习笔记56-IOS7状态栏适配方法一
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,所以了,我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下 ...
- IOS学习笔记57--IOS7状态栏适配(二)
上一遍文章通过XIB的设置达到了状态栏和view重合的问题,这一篇我们讲一讲网传的修改window frame方法. 先上步骤: 第一:在appdeletage里面 添加如下代码: if ( ...
- iOS 11 & iPhone X 适配资料集
本文主要简单谈谈并收集一些关于 iOS 11 & iPhone X 的适配及设计指南. iPhone X 众所周知,iPhone X 屏幕与其他的 iPhone 设备均不同,苹果称 iPhon ...
- iOS:界面适配--iPhone不同机型适配 6/6plus
iOS:界面适配--iPhone不同机型适配 6/6plus 机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系 ...
- 适配 iOS 11 & iPhone X 大全
1.升级iOS11后造成的变化 1. 1升级后,发现某个拥有tableView的界面错乱,组间距和contentInset错乱,因为iOS11中UIViewController的automatical ...
- iOS 11适配和iPhone X的适配
这两天对自己负责的项目进行iOS 11和iPhone X的适配,网上的博客很多,也看了很多别人的记录博客,这里把自己遇到的问题记录下,当然有些不仅仅是iOS 11和iPhone X的适配,还包括自己遇 ...
- 小程序学习-iPhone X适配
一. 安全区域(safe area) 与iPhone6/6s/7/8相比,iPhone X 无论是在屏幕尺寸.分辨率.甚至是形状上都发生了较大的改变,下面以iPhone 8作为参照物,先看看iPho ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
随机推荐
- oracle 数据字典和动态性能视图
一.概念数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息.动态性能视图记载了例程启动后的相关信息. 二.数据字典1).数据字典记录了数据库的系统信息,它是只读表和视图的集合 ...
- python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包
开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...
- JAVA 局部变量表
1. 除了 long,double 占用两个slot 之外,其他类型均占用一个slot. 2.在内容相同的情况下, 实例方法(不加 static) 会比 类方法 (static)对占用一个局部变量位置 ...
- 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya's Game。
废话不多说,先上题目. 51nod Codeforces 两个其实是一个意思,看51nod题目就讲的很清楚了,题意不再赘述. 直接讲我的分析过程:刚开始拿到手有点蒙蔽,看起来很难,然后......然后 ...
- Struts2和SpringMVC的区别
简单谈一下Struts2和SpringMVC的区别,文章有所引用知乎所对应的答案数据,和所查看的其余资料数据,进行一个简单的汇总,后续查看时使用: 知乎解释链接为:https://www.zhihu. ...
- hadoop各个名词的理解
Hadoop家族的各个成员 hadoop这个词已经流行好多年了,一提到大数据就会想到hadoop,那么hadoop的作用是什么呢? 官方定义:hadoop是一个开发和运行处理大规模数据的软件平台.核心 ...
- ovs2.7 在系统重启后,再次使用时提示数据库无法连接的问题。
问题现象如下,ovs开始安装后,对ovs的操作是正常的,但是,现在系统重启后,OVS的操作第一条命令就失败,如下: 问题解决方法: 参考 http://blog.csdn.net/xyq54/art ...
- haproxy + keepalived 实现网站高可靠
haproxy 1的配置文件,包括 keepalived 和 haproxy 的配置,分别如下: [haproxy 1的keepalived 配置文件] /etc/keepalived/keepal ...
- Win10打补丁KB4022725出现0x80073712错误
周末从老家回来折腾电脑,发现又收到了一大堆补丁,其中包括6月累积更新KB4022725.在安装过程中,一不小心手滑碰到了插线板,电脑断电了!!尼玛,这是要悲催的节奏么? 重新上完电开机,开机界面显示正 ...
- java 集合之实现类ArrayList 和 LinkedList
List 的方法列表 方法名 功能说明 ArrayList() 构造方法,用于创建一个空的数组列表 add(E e) 将指定的元素添加到此列表的尾部 get(int index) 返回此列表中指定位置 ...