一、引言

在iOS开发中,UIImageView类专门来负责图片数据的渲染,并且UIImageView也有帧动画的方法来播放一组图片,但是对于gif类型的数据,UIImageView中并没有现成的接口提供给开发者使用,在iOS中一般可以通过两种方式来播放gif动态图,一种方式是通过ImageIO框架中的方法将gif文件中的数据进行解析,再使用coreAnimation核心动画来播放gif动画,另一种方式计较简单,可以直接通过webView来渲染gif图。
二、为原生的UIImageView添加类别来支持gif动态图的播放
gif动态图文件中包含了一组图片及其信息,信息主要记录着每一帧图片播放的时间,我们如果获取到了gif文件中所有的图片同时又获取到每一帧图片播放的时间,就可以为UIImageView添加核心动画的方法来让其播放gif的内容了。
首先解析gif文件中的数据,代码如下:
//要引入ImageIO库
#import <ImageIO/ImageIO.h>
//解析gif文件数据的方法 block中会将解析的数据传递出来
-(void)getGifImageWithUrk:(NSURL *)url
returnData:(void(^)(NSArray<UIImage *> * imageArray,
NSArray<NSNumber *>*timeArray,
CGFloat totalTime,
NSArray<NSNumber *>* widths,
NSArray<NSNumber *>* heights))dataBlock{
//通过文件的url来将gif文件读取为图片数据引用
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
//获取gif文件中图片的个数
size_t count = CGImageSourceGetCount(source);
//定义一个变量记录gif播放一轮的时间
float allTime=0;
//存放所有图片
NSMutableArray * imageArray = [[NSMutableArray alloc]init];
//存放每一帧播放的时间
NSMutableArray * timeArray = [[NSMutableArray alloc]init];
//存放每张图片的宽度 (一般在一个gif文件中,所有图片尺寸都会一样)
NSMutableArray * widthArray = [[NSMutableArray alloc]init];
//存放每张图片的高度
NSMutableArray * heightArray = [[NSMutableArray alloc]init];
//遍历
for (size_t i=0; i<count; i++) {
CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
[imageArray addObject:(__bridge UIImage *)(image)];
CGImageRelease(image);
//获取图片信息
NSDictionary * info = (__bridge NSDictionary*)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
CGFloat width = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelWidth] floatValue];
CGFloat height = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelHeight] floatValue];
[widthArray addObject:[NSNumber numberWithFloat:width]];
[heightArray addObject:[NSNumber numberWithFloat:height]];
NSDictionary * timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime]floatValue];
allTime+=time;
[timeArray addObject:[NSNumber numberWithFloat:time]];
CFRelease(info);
}
CFRelease(source);
dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
}
为UIImageView添加一个设置gif图内容的方法:
-(void)yh_setImage:(NSURL *)imageUrl{
__weak id __self = self;
[self getGifImageWithUrk:imageUrl returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
//添加帧动画
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
NSMutableArray * times = [[NSMutableArray alloc]init];
float currentTime = 0;
//设置每一帧的时间占比
for (int i=0; i<imageArray.count; i++) {
[times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
currentTime+=[timeArray[i] floatValue];
}
[animation setKeyTimes:times];
[animation setValues:imageArray];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
//设置循环
animation.repeatCount= MAXFLOAT;
//设置播放总时长
animation.duration = totalTime;
//Layer层添加
[[(UIImageView *)__self layer]addAnimation:animation forKey:@"gifAnimation"];
}];
}
使用代码示例如下:
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0 , 320, 200)]; NSURL * url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]]; [imageView yh_setImage:url]; [self.view addSubview:imageView];
三、使用UIWebView来加载gif动态图数据
iOS中的UIWebView功能十分强大,可以通过UIWebView为载体,来展示gif图。并且这种方法也十分简单,代码如下:
//读取gif数据 NSData *gifData = [NSData dataWithContentsOfURL:imageUrl]; UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; //取消回弹效果 webView.scrollView.bounces=NO; webView.backgroundColor = [UIColor clearColor]; //设置缩放模式 webView.scalesPageToFit = YES; //用webView加载数据 [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
四、两种加载gif动态图方式的优劣
经过测试,从加载速度上来说,通过UIImageView类别加载的方式更加快速,UIWebView的方式加载时间会稍长,但是从性能上来比较,WebView的方式性能更优,播放的gif动态图更加流畅。在开发中,可以根据需求,适当选择,例如虽然WebView加载的方式性能更好,但是在许多情况下,原生的UIImageView能够更加自由的让开发者进行扩展。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章:
网站图片在线制作软件,怎么在图片上做链接?
如何在阿里云部署织梦网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何在万网ECS上快速搭建专属网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用花生壳三步快速搭建专属网站?
javascript中的try catch异常捕获机制用法分析
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
一键网站制作软件,义乌购一件代发流程?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何快速查询网站的真实建站时间?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
jQuery 常见小例汇总
贸易公司网站制作流程,出口贸易网站设计怎么做?
湖北网站制作公司有哪些,湖北清能集团官网?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
营销式网站制作方案,销售哪个网站招聘效果最好?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站VPS能否同时实现高效与安全翻墙?
建站之星上传入口如何快速找到?
如何通过wdcp面板快速创建网站?
如何快速完成中国万网建站详细流程?
如何用好域名打造高点击率的自主建站?
建站主机选择指南:服务器配置与SEO优化实战技巧
大连网站制作公司哪家好一点,大连买房网站哪个好?
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何有效防御Web建站篡改攻击?
建站之星官网登录失败?如何快速解决?
如何快速生成橙子建站落地页链接?
如何在企业微信快速生成手机电脑官网?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
再谈Python中的字符串与字符编码(推荐)
建设网站制作价格,怎样建立自己的公司网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何选购建站域名与空间?自助平台全解析
如何通过IIS搭建网站并配置访问权限?
如何破解联通资金短缺导致的基站建设难题?
深圳网站制作的公司有哪些,dido官方网站?
建站之星如何保障用户数据免受黑客入侵?
建站之星展会模版如何一键下载生成?
如何通过万网虚拟主机快速搭建网站?
如何选择高性价比服务器搭建个人网站?
专业网站建设制作报价,网页设计制作要考什么证?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
*请认真填写需求信息,我们会在24小时内与您取得联系。