我们知道Gif是由一阵阵画面组成的,而且每一帧画面播放的时常可能会不相等,观察上面两个例子,发现他们都没有对Gif中每一帧的显示时常做处理,这样的结果就是整个Gif中每一帧画面都是以固定的速度向前播放,很显然这并不总会符合需求。
于是自己写一个解析Gif的工具类,解决每一帧画面并遵循每一帧所对应的显示时间进行播放。
程序的思路如下:
1、首先使用ImageIO库中的CGImageSource家在Gif文件。
2、通过CGImageSource获取到Gif文件中的总的帧数,以及每一帧的显示时间。
3、通过CAKeyframeAnimation来完成Gif动画的播放。
下面直接上我写的解析和播放Gif的工具类的代码:
// // SvGifView.h // SvGifSample // // Created by maple on 3/28/13. // Copyright (c) 2013 smileEvday. All rights reserved. // #import@interface SvGifView : UIView /* * @brief desingated initializer */ - (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL; /* * @brief start Gif Animation */ - (void)startGif; /* * @brief stop Gif Animation */ - (void)stopGif; /* * @brief get frames image(CGImageRef) in Gif */ (NSArray*)framesInGif:(NSURL*)fileURL; @end // // SvGifView.m // SvGifSample // // Created by maple on 3/28/13. // Copyright (c) 2013 smileEvday. All rights reserved. // #import "SvGifView.h" #import #import /* * @brief resolving gif information */ void getFrameInfo(CFURLRef url, NSMutableArray *frames, NSMutableArray *delayTimes, CGFloat *totalTime,CGFloat *gifWidth, CGFloat *gifHeight) { CGImageSourceRef gifSource = CGImageSourceCreateWithURL(url, NULL); // get frame count size_t frameCount = CGImageSourceGetCount(gifSource); for (size_t i = 0; i
代码很短也比较容易,就不一一解释了。最开始的那个C函数主要就是用来解析Gif的,之所以用C函数是因为我要返回多个信息,而Objective-c只能返回一个参数,而且Objective-c和C语言可以很方便的混合编程。
另外再介绍两种使用UIImageView的方法:
1. 使用UIWebView播放
// 设定位置和大小 CGRect frame = CGRectMake(50,50,0,0); frame.size = [UIImage imageNamed:@"guzhang.gif"].size; // 读取gif图片数据 NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"guzhang" ofType:@"gif"]]; // view生成 UIWebView *webView = [[UIWebView alloc] initWithFrame:frame]; webView.userInteractionEnabled = NO;//用户不可交互 [webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil]; [self.view addSubview:webView]; [webView release];
2.将gif图片分解成多张png图片,使用UIImageView播放。
代码如下:
UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 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 = 1; //动画重复次数 [gifImageView startAnimating]; [self.view addSubview:gifImageView]; [gifImageView release];
注意:这个方法,如果gif动画每桢间的时间间隔不同,不能达到此效果。