Swift 玩转gif

491 查看

11954071-cd07deba2f814604

gif study

众所周知,iOS默认是不支持gif类型图片的显示的,但是我们项目中常常是需要显示gif为动态图片。那肿么办?第三方库?是的 ,很多第三方都支持gif , 如果一直只停留在用第三方上,技术难有提高。上版本的 Kingfisher 也支持gif ,研究了一番,也在网上搜索了一番,稍微了解了下iOS实现gif的显示,在此略做记录。

本篇文章要实现的效果如图:

gif显示效果

可以开始和暂停gif的播放,滑动时停止播放,这个简书也是这么做得,好多app为了滑动时顺畅,停止了gif。

下面要进入正文啦!

期待…

分解gif帧进行显示

我们一般从网络上下载的gif图片其实是将很多帧静态图片循环播放产生的动态效果,那么在iOS中,如果我们想要显示动态图,同样需要先把gif资源解析为一阵一阵的UIImage然后设定间隔时长,不断播放即可。思路是不是很简单呢?那么看看如何实现。

分几个步骤:

  1. 将gif图片转为NSData
  2. 根据NSData获取CGImageSource对象
  3. 获取帧数
  4. 根据帧数获取每一帧对应的UIImage对象和时间间隔
  5. 循环播放

首先我们需要引入import ImageIO , 提供了很多对图片操作的函数。

这里我们从网上down了一个gif的图片,其实下载也是一样的 ,我们需要的是NSData类型的数据,用NSURLSession下载也可以得到NSData类型的数据,这里下载的数据如何判断是否为gif呢?

Kingfisher 库中给出了解决方案,每种格式的图片前面几位都是固定的。所以只需要对比就能判断出类型,这里给出Kingfisher判断类型的代码。

有了这个扩展判断起来就方便很多了。

为了使demo简单,我们直接将gif放在本地沙盒。下载好直接拖进项目就OK了。

这样就可以很容易的得到NSData类型的数据

第一步已经完成啦。

然后通过CGImageSourceCreateWithData 方法创建一个CGImageSource 对象 。

这里的options是为了显示优化。提前解码,指定类型。

拿到CGImageSource 对象就可以为所欲为了。