載入gif動態圖的三種方式,gif動態三種方式
準備:本地圖片資源,GifView
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.GifView
//第三方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.幀動畫
- (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];}