加载GIF图片优化方案
HZDTammi
8年前
<p style="text-align:center"><img src="https://simg.open-open.com/show/50e7884d8f867bf17b6ae8e3049d4937.png"></p> <h2>前言</h2> <p>许多项目需要加载GIF图片,但是在直接使用UIImageView加载存在许多问题,于是查找资料做了一个加载GIF的Demo,思路来源 <a href="/misc/goto?guid=4959660098008486997" rel="nofollow,noindex">https://github.com/YouXianMing/Animations</a> 在链接里边,已经给出了解决办法,Demo只是将功能剥离,简单封装了一下。</p> <h2>思路</h2> <p>使用FLAnimatedImage来加载GIF图片,再利用SDWebImage来做缓存,话不多说,直接上代码。</p> <h2>使用方法</h2> <pre> <code class="language-objectivec">导入头文件#import "GIFView.h" 创建GIFView,添加到视图上 GIFView *view = [[GIFView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 300)]; view.url = @"http://upload-images.jianshu.io/upload_images/1979970-9d2b1cc945099612.gif?imageMogr2/auto-orient/strip"; [self.view addSubview:view];</code></pre> <h2>GIFView内部代码</h2> <pre> <code class="language-objectivec">@interface GIFView() /**GIF视图*/ @property (nonatomic,weak)FLAnimatedImageView *gifImageView; @end @implementation GIFView -(instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self initUI]; } return self; } - (void)initUI { //创建FLAnimatedImageView,继承自UIView FLAnimatedImageView *gifImageView = [[FLAnimatedImageView alloc] init]; gifImageView.frame = self.frame; [self addSubview:gifImageView]; _gifImageView = gifImageView; } -(void)setUrl:(NSString *)url { _url = url; //将GIF转换成Data NSData *gifImageData = [self imageDataFromDiskCacheWithKey:url]; //沙盒存在,直接加载显示 if (gifImageData) { [self animatedImageView:_gifImageView data:gifImageData]; //沙盒不存在,网络获取 } else { __weak __typeof(self) weakSelf = self; NSURL *newUrl = [NSURL URLWithString:url]; [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:newUrl options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { [[[SDWebImageManager sharedManager] imageCache] storeImage:image recalculateFromImage:NO imageData:data forKey:newUrl.absoluteString toDisk:YES]; //主线程显示 dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf animatedImageView:_gifImageView data:data]; }); }]; } } //通过数据创建GIF - (void)animatedImageView:(FLAnimatedImageView *)imageView data:(NSData *)data { FLAnimatedImage *gifImage = [FLAnimatedImage animatedImageWithGIFData:data]; imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); imageView.animatedImage = gifImage; imageView.alpha = 0.f; [UIView animateWithDuration:1.f animations:^{ imageView.alpha = 1.f; }]; } //从沙盒读取 - (NSData *)imageDataFromDiskCacheWithKey:(NSString *)key { NSString *path = [[[SDWebImageManager sharedManager] imageCache] defaultCachePathForKey:key]; return [NSData dataWithContentsOfFile:path]; }</code></pre> <h2>效果图</h2> <p>这里需要注意要用真机测试,模拟器测试会看到卡顿现象</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/e11ea947c6832e5c15e6fd66d7bcf828.gif"></p> <p style="text-align:center">真机效果图.gif</p> <h2>声明</h2> <p>在这里说明下,只是简单的剥离功能,封装了一下,方便大家使用。</p> <p> </p> <p>来自:http://www.jianshu.com/p/ed49ff11334d</p> <p> </p>