天天看点

iOS 10 的适配问题

随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 在你的项目中,当需要判断系统版本的话,不要使用下面的方法:

它会永远返回<code>NO</code>,<code>substringToIndex:1</code>在iOS 10 会被检测成 iOS 1了, 应该使用下面的这些方法: Objective-C 中这样写:

或者使用:

有时候会缺少一些常量,<code>NSFoundationVersionNumber</code>是在<code>NSObjCRuntime.h</code>中定义的,作为Xcode7.3.1的一部分,我们设定常熟范围从iPhone OS 2到<code>#define NSFoundationVersionNumber_iOS_8_4 1144.17</code>,在iOS 10(Xcode 8)中,苹果补充了缺少的数字,设置有未来的版本.

Swift中这样写:

或者使用

你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志:

iOS 10 的适配问题

Snip20160905_1.png

这是因为iOS对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述,但是,在使用Xcode 8之前的Xcode还是使用系统的权限通知框.

要想解决这个问题,只需要在<code>info.plist</code>添加<code>NSContactsUsageDescription</code>的key, value自己随意填写就可以,这里列举出对应的key(Source Code模式下):

如果不起作用,可以请求后台权限,类似于这样:

或者在Xcode里选中当前的<code>target</code>,选择<code>Capabilities</code>,找到<code>Background Modes</code>,打开它,在里面选择对应权限

iOS 10 的适配问题

后台模式的操作.png

官方文档中说:大多数<code>core</code>开头的图形框架和<code>AVFoundation</code>都提高了对扩展像素和宽色域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色的建议转换为使用sRGB,在<code>UIColor</code>类中新增了两个api:

它有五种取值,分别是:

iOS 10 的适配问题

在iOS 10 之前,UICollectionView上面如果有大量cell,当用户活动很快的时候,整个UICollectionView的卡顿会很明显,为什么会造成这样的问题,这里涉及到了iOS 系统的重用机制,当cell准备加载进屏幕的时候,整个cell都已经加载完成,等待在屏幕外面了,也就是整整一行cell都已经加载完毕,这就是造成卡顿的主要原因,专业术语叫做:掉帧.

要想让用户感觉不到卡顿,我们的app必须帧率达到60帧/秒,也就是说每帧16毫秒要刷新一次.

1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用<code>prepareForReuse</code>方法,在这个方法里面,可以重置cell的状态,加载新的数据;

2.继续滑动,就会调用<code>cellForItemAtIndexPath</code>方法,在这个方法里面给cell赋值模型,然后返回给系统;

3.当cell马上进去屏幕的时候,就会调用<code>willDisplayCell</code>方法,在这个方法里面我们还可以修改cell,为进入屏幕做最后的准备工作;

4.执行完<code>willDisplayCell</code>方法后,cell就进去屏幕了.当cell完全离开屏幕以后,会调用<code>didEndDisplayingCell</code>方法.

1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cell从reusr队列拿出来,然后调用<code>prepareForReuse</code>方法,在这里当cell还没有进去屏幕的时候,就已经提前调用这个方法了,对比之前的区别是之前是cell的上边缘马上进去屏幕的时候就会调用该方法,而iOS 10 提前到cell还在屏幕外面的时候就调用;

2.在<code>cellForItemAtIndexPath</code>中创建cell,填充数据,刷新状态等操作,相比于之前也提前了;

3.用户继续滑动的话,当cell马上就需要显示的时候我们再调用<code>willDisplayCell</code>方法,原则就是:何时需要显示,何时再去调用<code>willDisplayCell</code>方法;

4.当cell完全离开屏幕以后,会调用<code>didEndDisplayingCell</code>方法,跟之前一样,cell会进入重用队列.

在iOS 10 之前,cell只能从重用队列里面取出,再走一遍生命周期,并调用<code>cellForItemAtIndexPath</code>创建或者生成一个cell.

在iOS 10 中,系统会cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用<code>willDisplayCell</code>方法就可以重新出现在屏幕中了.

iOS 10 中,系统是一个一个加载cell的,二以前是一行一行加载的,这样就可以提升很多性能;

这个是为了降低UICollectionViewCell在加载的时候所花费的时间,在 iOS 10 中,除了数据源协议和代理协议外,新增加了一个<code>UICollectionViewDataSourcePrefetching</code>协议,这个协议里面定义了两个方法:

在<code>ColletionView prefetchItemsAt indexPaths</code>这个方法是异步预加载数据的,当中的<code>indexPaths</code>数组是有序的,就是item接收数据的顺序;

<code>CollectionView cancelPrefetcingForItemsAt indexPaths</code>这个方法是可选的,可以用来处理在滑动中取消或者降低提前加载数据的优先级.

注意:这个协议并不能代替之前读取数据的方法,仅仅是辅助加载数据.

Pre-Fetching预加载对UITableViewCell同样适用.

在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脱离了UITableViewController.现在RefreshControl是UIScrollView的一个属性.

使用方法:

大家遇到问题欢迎向我提出,我会不断完善这个项目.

文/Eternaldream(简书作者)

原文链接:http://www.jianshu.com/p/f8151d556930

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1866986 ,如需转载请自行联系原作者

继续阅读