準備:本地圖片資源,GifViewweb
GifView代碼:數組
/** * 調用結束就開始播放動畫,若是須要用戶指定什麼時候播放的話,只須要把timer的開始放到合適的位置。經過對CFDictonaryRaf 也就是gifProperties的改變,咱們還能夠控制動畫是否循環播放以及循環多少次中止。 經過對index的改變也能夠控制動畫從某幀開始播放。同理,同時改變index和count的話,也能夠控制從某幀到某幀的播放。 注意:- (void)stopGif;以後才能夠退出這個類。不然timer不會關閉,產生內存泄露。 */ #import <UIKit/UIKit.h> #import <ImageIO/ImageIO.h> @interface GifView : UIView { CGImageSourceRef gif; // 保存gif動畫 NSDictionary *gifProperties; // 保存gif動畫屬性 size_t index;// gif動畫播放開始的幀序號 size_t count;// gif動畫的總幀數 NSTimer *timer;// 播放gif動畫所使用的timer } - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath; - (id)initWithFrame:(CGRect)frame data:(NSData *)_data; - (void)stopGif;
#import "GifView.h" #import <QuartzCore/QuartzCore.h> @implementation GifView - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath{ self = [super initWithFrame:frame]; if (self) { gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] forKey:(NSString *)kCGImagePropertyGIFDictionary]; gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties); count =CGImageSourceGetCount(gif); timer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES]; [timer fire]; } return self; } - (id)initWithFrame:(CGRect)frame data:(NSData *)_data{ self = [super initWithFrame:frame]; if (self) { gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] forKey:(NSString *)kCGImagePropertyGIFDictionary]; // gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties); gif = CGImageSourceCreateWithData((CFDataRef)_data, (CFDictionaryRef)gifProperties); count =CGImageSourceGetCount(gif); timer = [NSTimer scheduledTimerWithTimeInterval:0.12 target:self selector:@selector(play) userInfo:nil repeats:YES]; [timer fire]; } return self; } -(void)play { index ++; index = index%count; CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, (CFDictionaryRef)gifProperties); self.layer.contents = (__bridge id)ref; CFRelease(ref); } -(void)removeFromSuperview { NSLog(@"removeFromSuperview"); [timer invalidate]; timer = nil; [super removeFromSuperview]; } - (void)dealloc { NSLog(@"dealloc"); CFRelease(gif); } - (void)stopGif { [timer invalidate]; timer = nil; }
加載Gif的三種方式:(從網絡或者本地)網絡
- (NSData *)loadDataForIndex:(NSInteger)index { NSData *data = nil; if (index == 0) { //網絡 data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://s14.sinaimg.cn/mw690/005APVsyzy6MFOsVFfv5d&690"]]; }else { //本地 data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"run" ofType:@"gif"]]; } return data; }
1.GifViewoop
//第三方GifView(實現gif動畫播放是經過將動畫文件讀取到CGImageSourceRef,而後用NSTimer來播放的。) //- (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath; GifView *dataView = [[GifView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) data:data]; [self.view addSubview:dataView]; // [dataView stopGif];
2.webView(不會出現內存問題)動畫
//webView UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 120, 100, 100)]; webView.backgroundColor = [UIColor redColor]; webView.scalesPageToFit = YES; [webView loadData:data MIMEType:@"image/gif" textEncodingName:nil baseURL:nil]; [self.view addSubview:webView];
3.幀動畫spa
- (void)runGIFForImage { UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 240, 100, 100)]; NSArray *gifArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"1"], [UIImage imageNamed:@"2"], [UIImage imageNamed:@"3"], [UIImage imageNamed:@"4"], [UIImage imageNamed:@"5"], [UIImage imageNamed:@"6"], [UIImage imageNamed:@"7"], [UIImage imageNamed:@"8"], [UIImage imageNamed:@"9"], [UIImage imageNamed:@"10"], [UIImage imageNamed:@"11"], [UIImage imageNamed:@"12"], [UIImage imageNamed:@"13"], [UIImage imageNamed:@"14"], [UIImage imageNamed:@"15"], [UIImage imageNamed:@"16"], [UIImage imageNamed:@"17"], [UIImage imageNamed:@"18"], [UIImage imageNamed:@"19"], [UIImage imageNamed:@"20"], [UIImage imageNamed:@"21"], [UIImage imageNamed:@"22"],nil]; gifImageView.animationImages = gifArray; //動畫圖片數組 gifImageView.animationDuration = 5; //執行一次完整動畫所需的時長 gifImageView.animationRepeatCount = 999; //動畫重複次數 [gifImageView startAnimating]; [self.view addSubview:gifImageView]; }