您的位置:首页 > 移动开发 > IOS开发

IOS 加载GIF图片

2016-11-22 00:00 253 查看
摘要: IOS加载GIF,UIlmageView 显示gif

需要显示GIF图片



1,需要添加一个UIImageView的分类

#import "UIImageView+ASGif.h"
#import <ImageIO/ImageIO.h>

#if __has_feature(objc_arc)
#define toCF (__bridge CFTypeRef)
#define ARCCompatibleAutorelease(object) object
#else
#define toCF (CFTypeRef)
#define ARCCompatibleAutorelease(object) [object autorelease]
#endif

@implementation UIImageView(ASGif)

- (void)animatedGIFImageSource:(CGImageSourceRef) source
andDuration:(NSTimeInterval) duration {

if (!source) return;
size_t count = CGImageSourceGetCount(source);
NSMutableArray *images = [NSMutableArray arrayWithCapacity:count];
for (size_t i = 0; i < count; ++i) {
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, i, NULL);
if (!cgImage)
return;
[images addObject:[UIImage imageWithCGImage:cgImage]];
CGImageRelease(cgImage);
}
[self setAnimationImages:images];
[self setAnimationDuration:duration];
[self startAnimating];
}

- (NSTimeInterval)durationForGifData:(NSData *)data {
char graphicControlExtensionStartBytes[] = {0x21,0xF9,0x04};
double duration=0;
NSRange dataSearchLeftRange = NSMakeRange(0, data.length);
while(YES){
NSRange frameDescriptorRange = [data rangeOfData:[NSData dataWithBytes:graphicControlExtensionStartBytes
length:3]
options:NSDataSearchBackwards
range:dataSearchLeftRange];
if(frameDescriptorRange.location!=NSNotFound){
NSData *durationData = [data subdataWithRange:NSMakeRange(frameDescriptorRange.location+4, 2)];
unsigned char buffer[2];
[durationData getBytes:buffer];
double delay = (buffer[0] | buffer[1] << 8);
duration += delay;
dataSearchLeftRange = NSMakeRange(0, frameDescriptorRange.location);
}else{
break;
}
}
return duration/100;
}

- (void)showGifImageWithData:(NSData *)data {
NSTimeInterval duration = [self durationForGifData:data];
CGImageSourceRef source = CGImageSourceCreateWithData(toCF data, NULL);
[self animatedGIFImageSource:source andDuration:duration];
CFRelease(source);
}

- (void)showGifImageWithURL:(NSURL *)url {
NSData *data = [NSData dataWithContentsOfURL:url];
[self showGifImageWithData:data];
}
@end

2,导入图片的分类 UIImageView(ASGif)

NSString *extensionName = newsData.iconUrl.pathExtension;
if ([extensionName.lowercaseString isEqualToString:@"gif"]) {
[self.icon showGifImageWithURL:[NSURL URLWithString:newsData.iconUrl]];
} else {
[self.icon setImageWithURL:[NSURL URLWithString:newsData.iconUrl] placeholderImage:[UIImage imageNamed:@"pic_cut_dis"]];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息