tableview cell中加载多个gif图片方案
2021-12-24 本文已影响0人
孤雁_南飞
前言:为了在 tableview 中更刘畅的加载 gif 图片,调研了现在iOS平台多个图片加载开源三方库
一、调研:
1、使用 SDWebImage 的 SDAnimatedImageView 加载 gif 图片,少量无伤大雅,可以使用,大量会导致卡顿、崩溃
2、使用 swift 的 Kingfisher 中的 AnimatedImageView 加载 gif 图片,少量无伤大雅,可以使用,大量会导致卡顿、崩溃,情况比SDWebImage 略差
3、使用 YYWebImage 的 YYAnimatedImageView 加载 gif 图片,效果非常好,在 tableview 里边中没有卡顿现象,
二、使用:
经过测试使用,发现了YYWebImage的两个问题
1、在 iOS14.0 以上,YYAnimatedImageView 只加载 gif 图 ,不能加载普通图片
使用下面是代码,只加载gif图片,很难受
private lazy var imageView: YYAnimatedImageView = {
let view = YYAnimatedImageView()
return view
}()
imageView.yy_setImage(with: URL(string: modelVM?.imgUrl ?? ""))
解决方法如下:
通过分类的方式对源码进行修改。新建 YYAnimatedImageView 的分类,实现以下方法
+ (void)load {
// 获取系统的对象方法
Method displayLayerMethod = class_getInstanceMethod(self, @selector(displayLayer:));
// 获取自己定义的对象方法
Method displayLayerNewMethod = class_getInstanceMethod(self, @selector(displayLayerNew:));
// 方法交换
method_exchangeImplementations(displayLayerMethod, displayLayerNewMethod);
}
- (void)displayLayerNew:(CALayer *)layer {
Ivar imgIvar = class_getInstanceVariable([self class], "_curFrame");
UIImage *img = object_getIvar(self, imgIvar);
if (img) {
layer.contents = (__bridge id)img.CGImage;
} else {
if (@available(iOS 14.0, *)) {
[super displayLayer:layer];
}
}
}
亲测可用
我把YYImage放到了自己仓库里,并做了修改,大家可以放到Podfile 这样使用 ,当然别忘记了YYWebImage,其他什么都无需改动
pod 'YYImage', :git=> 'https://gitee.com/tripartite/YYImage.git', :tag=> '1.0.5'
2:有一小部分图片仍然出现加载问题,原因未知,初步查看是图片链接有问题,但是使用SDWebImage 加载正常
解决方法:因为我们上传的gif图片后缀均设置为.gif,为了避免上述一小部分图片问题,非gif暂时使用SDWebImage 加载
最后:完结撒花