要做一个tableview,cell内全部展示的是GIF。GIF是由多个image组成的,测试过后,得到几种使用方法,介绍一下:
1.最省心的,使用sdwebimage,使用imageview sdsetimageWithUrl: placeHolder:这个方法就可以,sd内部做好了缓存处理,上啦下拉tableview的时候cell刷新,也不会卡顿,效果最好。
2.使用webview。有两种,一个是wkwebview,一个是UIwebview,使用UIwebview的时候如果有加载进度条的需求不太好做,如果没有这个需求则正常使用就行。如果有这个需求那么建议使用wkwebview。创建wkwebview之后,创建一个progressview,给wkwebview添加一个观察者,键名是estimatedProgress
[_wkwebview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
观察方法中,CGFloat newProgress = [[change valueForKey:NSKeyValueChangeNewKey] doubleValue];这个就是进度。
完整观察方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"estimatedProgress"]) {
CGFloat newProgress = [[change valueForKey:NSKeyValueChangeNewKey] doubleValue];
if ([change[@"new"] floatValue] < [change[@"old"] floatValue]) {
return;
}
if (newProgress == 1) {
_progress.hidden = YES;
[_progress setProgress:0];
}else{
_progress.hidden = NO;
[_progress setProgress:newProgress animated:YES];
}
}
}
这样可以在你添加的位置和时间需要展示progress就行了
3.使用三方FLAnimatedImageView
这个就是用来显示GIF的,FLAnimatedImageView是一个继承与UIimageView的子类,有一个FLAnimatedImage 类型的属性,主要用到了这个来显示gif,我是这么用的,使用sdwebimagemanager 初始化一个图片下载管理器,使用它调用loadimage方法下载图片。在下载回调用有图片数据的image,和图片的所有data,在回调内切到主线程,对FLAnimatedImageView对象的FLAnimatedImage属性赋值即可。在回调内注意将图片保存到本地,下次滑动cell的时候先查看本地是否有该图片,没有就下载,有就直接拿来展示,代码:
NSData *data = [LGUtils getCacheImageWithKey:record.img];//record.img是你传进来的gif的地址,我在这里下载完成后当成键名把图片的data给存起来了
if (data.length > 0) {
_animateImageView.animateImage = [UIImage animatedImageWithGIFData:data];
}else{
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL:[NSURL URLWithString:record.img] options:SDWebImageRetryFailed progress:nil completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
if (data.length > 0) {
[LGUtils saveImageDataTocache:data withKey:record.img];
dispatch_async(dispatch_get_main_queue(), ^{
_animateImageView.animateImage = [UIImage animatedImageWithGIFData:data];
})
}
}];
}
代码里的如何存储图片到本地cache文件夹,和取出文件 去网上找吧,一大堆
三种方法都试过,第三种尚可,有点慢,第一种最快,省心,cell滑动时候不影响效果,第二种不好,webview展示GIF效果还是差点。webview还要针对image的大小做适配,使用imageview展示则可以通过设置设置图片的显示方式contentmode完善显示效果