在iOS中播放动态图片,常用的方法有两种,一种是利用UIWebView,一种是利用UIImageView的序列帧动画。
使用UIWebView播放gif:
//web播放gif动态图片
//创建UIWebView对象并设置位置居中
UIWebView *webView = [[UIWebView alloc] init];
webView.center = self.view.center;
//获取图片的大小
CGSize size = [UIImage imageNamed:@"smile.gif"].size;
webView.bounds = CGRectMake(0, 0, size.width, size.height);
//将图片的webView的大小和图片的大小设置成一致
webView.scrollView.contentSize = size;
//添加到当前的ViewController上
[self.view addSubview:webView];
//关闭交互功能
webView.userInteractionEnabled = NO;
//将图片位置设置为url
NSURL *url = [[NSBundle mainBundle] URLForResource:@"smile" withExtension:@"gif"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
//读取gif数据 (ps:上面和下面的结果是一样的)
// NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"smile" ofType:@"gif"]];
//下面函数中,后面两个参数,因为要和swift的?、!保持一致,所以如果为空的话会有警告
// [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
用UIWebView来显示gif,有时候位置会发生偏移,这个是为什么,我也不知道,希望有知道的大大可以告诉我。为了解决这个问题,我使用了UIWebView里的delegate的webViewDidFinishLoad:方法:
//首先设置delegate
webView.delegate = self;
//实现方法来调整位置
- (void)webViewDidFinishLoad:(UIWebView *)webView {
webView.scrollView.contentOffset = CGPointMake(0, 0);
}
使用UIImageView的序列帧动画播放gif
在代码之前,我们首先要将gif的每一帧图片都取出来,使用苹果电脑打开gif图片,就可以发现其每一帧的图片,将每一帧的图片都保存为png格式(jpeg也可以,但是jpeg会失真,苹果官方推荐png格式),并命名好一系列利于循环获取的名字。将这些图片都放入到我们的项目中,我demo中的gif有4帧动画,我直接将图片的命名为 数字.png (1.png, 2.png, 3.png, 4.png)。
//创建UIImageView对象并设置位置居中
UIImageView *imageView = [[UIImageView alloc] init];
imageView.center = self.view.center;
//获取图片的大小
CGSize size = [UIImage imageNamed:@"1.gif"].size;
imageView.bounds = CGRectMake(0, 0, size.width, size.height);
//将图片的imageView的大小和图片的大小设置成一致
imageView.bounds = CGRectMake(0, 0, size.width, size.height);
//添加到当前的ViewController上
[self.view addSubview:webView];
//创建一个可变数组来存储每一帧的图片
NSMutableArray *imageArray = [[NSMutableView alloc] init];
//取出每一帧图片,存放到imageArray中
for (int i = 1 ; i < 5; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i]];
NSLog(@"%@", image);
[imageArray addObject:image];
}
//设置序列帧
imageView.animationImages = imageArray;
//设置动画播放一次的时间
imageView.animationDuration = 0.4;
//设置动画的重复播放次数(0为无限次播放)
imageView.animationRepeatCount = 0;
//开始动画
[imageView startAnimating];
使用UIImageView来播放动画,还有一个问题,就是内存占用大,特别图片多而且大的时候,所以每一次不再需要播放gif的会后,最好把这些图片都释放掉。如果只需要播放可数次数,那么可以这么设置:
//在延迟动画的10次播放时长后,释放掉imageView.animationImages
NSTimeInterval delay = self.imageView.animationDuration * 10;
[self.imageView performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:delay];
相比而言,我觉得使用UIWebView来显示gif会比较便捷,不用讲每一帧的图片取出,也不用担心内存的占用,唯一不科学的也就位置的问题了。