当前位置: 代码迷 >> Iphone >> 加载gif动态图的三种模式
  详细解决方案

加载gif动态图的三种模式

热度:87   发布时间:2016-04-25 05:40:06.0
加载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];}

 

  相关解决方案