全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅析IOS中播放gif动态图的方法

一、引言

    在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能够更加自由的让开发者进行扩展。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS  # 播放gif动态图 


相关文章: 网站图片在线制作软件,怎么在图片上做链接?  如何在阿里云部署织梦网站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  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小时内与您取得联系。