KingFisher源码分析---|KingFisher源码分析--- 拓展

ImageTransition 在使用Kingfiser加载图片的时候setImage方法有一个回调

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png 发现有一个执行动画的代码
这个动画属性是在KingfisherOptionsInfoItem里面有一个case transition(ImageTransition)成员。
查看源码发现ImageTransition是一个动画枚举

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png 动画执行的方法是由于是写在KingfisherWrapper这个接口的拓展里所有UIimageView和UIImage都享有这个方法,r如果是他限制好了的4个只需要调用并限制时间,否则可以自定义UIView.AnimationOptions实现各种效果

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png 图片处理Processor

KignFisher提供了一套图片处理机制可以图片倒角部分区域倒角,添加各种滤镜、并设置相应的属性,可以说功能十分强大满足一些非图片处理软件的日常需求
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png 并且他将各个特效的实现写成了extension KingfisherWrapper where Base: Image { 意思是只有image的对象才可以实现这些效果而ImageProcessor则是实现组合了这些特效
imageDrawing
  1. 创建倒角和倒角方向的image对象

    KingFisher源码分析---|KingFisher源码分析--- 拓展
    文章图片
    image.png
  2. 调整图片大小并设置相关contengmode

    KingFisher源码分析---|KingFisher源码分析--- 拓展
    文章图片
    image.png
...
Provider 上回说当我们设置setimage的时候会设计到一个Source枚举里面包含两个东西一个是URL叫network这个目标图像是从远程网络获取,还有一个是provider 来自本地存储或任何其他编码格式(如base64)。

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
来自本地存储或任何其他编码格式(如base64)。
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
所以只要自定义的图像符合上述要求即可成功加载到imageview控件上,并设置cachekey缓存起来
Gif图 当设置gif图的时候可以发现根据KingfisherOptionsInfoItem的preloadAllAnimationData值来判断设置加载方式如果是UIImage则只加载gif的第一张 如果是animationview可以设置加载gif图
所有的动画资源都应该被预加载,默认是不加载的,或者符合下面哪一个框架。当需要被加载的时候,如果该选项为true,所有的动画图像数据和解码将被加载到内存。这个操作主要是设置背式兼容性,不应该直接设置为true,应该选择imageview的类去加在gif数据,在KingFisher里有两个类支持绘制Gif图,AnimatedImageView,不预加载所有数据,他花费更少的内存。但是当cpu绘制的时候,uiimageview会加载完所有的数据,它使用更多的内存,但只有一帧的解码图像。
意思是如果使用预加载数据那么将使用UIImageVIew进行绘制,如果不适用预加载数据那么将会使用AnimationView来绘制这个Gif
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
UIimageVIew预加载所有数据,而AnimationView不预加载所有数据这就说明当绘制Gif时候用AnimationView更加高效
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png AnimatedImageView 他和UIImageView的区别是 UIImageView不能控制进度暂停等操作
看KingFisher的下载流程最后一步是 将 base的image设置成了 返回值 可以发现 Animation的image属性被重写了当被赋值时会调用 reset方法当 Animator 对象为nil 那么会生成一个Animator对象

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png Animator对象是一个Gif构造器:

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
animationFrames 是由一个一个 AnimatedFrame构成这个结构体里有帧的图像对象和停留时间
然后通过 Animator 里的 prepareFramesAsynchronously方法和 setupAnimatedFrames来获得数据, setupAnimatedFrames是通过 GIFAnimatedImage这个类工作,他将imageSource里的数据转成了 duration 和 image对象 并一帧一帧队列起来。
KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png
根据这些参数可以构成一个Gif对象,最后通过displayLink来进行渲染执行该动画。
【KingFisher源码分析---|KingFisher源码分析--- 拓展】这里将Proxy 设置target来防止内存泄漏

KingFisher源码分析---|KingFisher源码分析--- 拓展
文章图片
image.png

    推荐阅读