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

发现有一个执行动画的代码
这个动画属性是在KingfisherOptionsInfoItem里面有一个case transition(ImageTransition)成员。
查看源码发现ImageTransition是一个动画枚举

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

图片处理Processor
KignFisher提供了一套图片处理机制可以图片倒角部分区域倒角,添加各种滤镜、并设置相应的属性,可以说功能十分强大满足一些非图片处理软件的日常需求

并且他将各个特效的实现写成了extension KingfisherWrapper where Base: Image { 意思是只有image的对象才可以实现这些效果而ImageProcessor则是实现组合了这些特效
imageDrawing
-
创建倒角和倒角方向的image对象
image.png
-
调整图片大小并设置相关contengmode
image.png
...
Provider
上回说当我们设置setimage的时候会设计到一个Source枚举里面包含两个东西一个是URL叫network这个目标图像是从远程网络获取,还有一个是provider 来自本地存储或任何其他编码格式(如base64)。

来自本地存储或任何其他编码格式(如base64)。



所以只要自定义的图像符合上述要求即可成功加载到imageview控件上,并设置cachekey缓存起来
Gif图
当设置gif图的时候可以发现根据KingfisherOptionsInfoItem的preloadAllAnimationData值来判断设置加载方式如果是UIImage则只加载gif的第一张 如果是animationview可以设置加载gif图
所有的动画资源都应该被预加载,默认是不加载的,或者符合下面哪一个框架。当需要被加载的时候,如果该选项为true,所有的动画图像数据和解码将被加载到内存。这个操作主要是设置背式兼容性,不应该直接设置为true,应该选择imageview的类去加在gif数据,在KingFisher里有两个类支持绘制Gif图,AnimatedImageView,不预加载所有数据,他花费更少的内存。但是当cpu绘制的时候,uiimageview会加载完所有的数据,它使用更多的内存,但只有一帧的解码图像。
意思是如果使用预加载数据那么将使用UIImageVIew进行绘制,如果不适用预加载数据那么将会使用AnimationView来绘制这个Gif



UIimageVIew预加载所有数据,而AnimationView不预加载所有数据这就说明当绘制Gif时候用AnimationView更加高效

AnimatedImageView
他和UIImageView的区别是 UIImageView不能控制进度暂停等操作
看KingFisher的下载流程最后一步是 将 base的image设置成了 返回值 可以发现 Animation的image属性被重写了当被赋值时会调用 reset方法当 Animator 对象为nil 那么会生成一个Animator对象

Animator对象是一个Gif构造器:

animationFrames 是由一个一个AnimatedFrame构成这个结构体里有帧的图像对象和停留时间
然后通过 Animator 里的prepareFramesAsynchronously方法和setupAnimatedFrames来获得数据,setupAnimatedFrames是通过GIFAnimatedImage这个类工作,他将imageSource里的数据转成了 duration 和 image对象 并一帧一帧队列起来。

根据这些参数可以构成一个Gif对象,最后通过displayLink来进行渲染执行该动画。
这里将Proxy 设置target来防止内存泄漏

网友评论