老大说,咱们网站的图要支持动图,这样网站会有意思地多
所以我们是要往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];
完工~~
所以你花了一下午时间都干了什么!!
网友评论