iOS 加载GIF图片

要做一个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:(NSDictionaryid> *)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完善显示效果

你可能感兴趣的:(控件)