当App需要显示动态图,我是这么干的

老大说,咱们网站的图要支持动图,这样网站会有意思地多

所以我们是要往A站B站的二次元方向发展吗
所以咱们的App也要支持动态图片
关于支持GIF动图这件事,我第一反应就是

CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)data, nil);
size_t count = CGImageSourceGetCount(source);
float allTime = 0;
NSMutableArray *imageArray = [[NSMutableArray alloc] init];
NSMutableArray *timeArray = [[NSMutableArray alloc] init];
for (size_t i=0; i<count; i++) {
  CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
  [imageArray addObject:[UIImage imageWithCGImage:image]];
  CGImageRelease(image);
  NSDictionary *info = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
  NSDictionary *timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
  CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime] floatValue];
  [timeArray addObject:[NSNumber numberWithFloat:time]];
  allTime += time;
}
        
UIImage *image = [UIImage animatedImageWithImages:imageArray duration:allTime];
dispatch_async(dispatch_get_main_queue(), ^{
  self.image = image;
});

通过NSURLSession下载下来图片,然后经过简单处理变成UIImage。ps:这里忽略完全无视了帧与帧之间的时间间隔问题

捂脸

事情总是一步一步来的嘛,这样子已经解决了动图显示的问题了,不会再是总显示图片第一帧的样子了。
之前的UIImageView都是使用的AFNetworking提供的UIImageView+AFNetworking.h,然而它并不支持GIF,只会显示第一帧。而它提供的方法直接返回的就是UIImage,所以经过仔细的阅读源码,终于在AFURLResponseSerialization.m里找到了这个方法

+ (UIImage *)af_safeImageWithData:(NSData *)data

将上面处理NSData到UIImage的方法粘进去,嗯,perfect,完美融入项目,我真是太机智了。

然而,事妈龟毛处女座的我对那个Unlock和xxxx的提示(忘了怎么提示的了)真的难以接受,于是在衡量了自己写NSURLSessionDataTask下载图片与UIImageView+AFNetworking.h混用并添加缓存机制(我很懒的用了AFNetworking提供的……)的工作量之后,我毅然决然地选择了

SDWebImage

然后在两分钟的pod install之后
[self sd_setImageWithURL:url placeholderImage:placeholderImage];

完工~~


所以你花了一下午时间都干了什么!!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容