一、给原生的 UIImageView 添加类别来支持 GIF 播放

GIF 动态图片文件中包含了一组图片及信息,信息主要记录着每一帧图片播放的时间,我们如果获取到了 gif 文件中所有的图片同时又获取到每一帧图片播放的时间,就可以为 UIImageView 添加关键帧动画的方法让其播放 GIF 的内容了

1.新建一个 UIImageView 的类别

2.解析 GIF ,获得 GIF 的信息

  1. #pragma mark -- 解析 DGIF
  2. -(void)gifWithUrl:(NSURL *)url
  3. returnData:(void(^)(NSArray<UIImage *> * imageArray,
  4. NSArray<NSNumber *>*timeArray,
  5. CGFloat totalTime,
  6. NSArray<NSNumber *>* widths,
  7. NSArray<NSNumber *>* heights))dataBlock
  8. {
  9. //通过文件的 url 来将 gif 文件读取为图片数据引用
  10. CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url,NULL);
  11. //获取 gif 文件中的图片个数
  12. size_t count = CGImageSourceGetCount(source);
  13. //定义一个变量记录 gif 播放一轮的时间
  14. float allTime = ;
  15. //存放所有图片
  16. NSMutableArray *imageArray = [NSMutableArray array];
  17. //存放每一帧播放的时间
  18. NSMutableArray *timeArray = [NSMutableArray array];
  19. //存放每张图片的宽度(一般在一个 gif 文件中,所有文件的尺寸都一样)
  20. NSMutableArray *widthArray = [NSMutableArray array];
  21. //存放每张图片的高度
  22. NSMutableArray * heightArray = [NSMutableArray array];
  23. //遍历
  24. for(size_t i = ;i < count; i++){
  25. //获取图片信息
  26. CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
  27. [imageArray addObject:(__bridge UIImage *)(image)];
  28. CGImageRelease(image);
  29. //获取图片信息
  30. NSDictionary *info = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
  31. NSLog(@"%@",info);
  32. CGFloat width = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelWidth]floatValue];
  33. CGFloat height = [[info objectForKey:(__bridge NSString *)kCGImagePropertyPixelHeight]floatValue];
  34. [widthArray addObject:[NSNumber numberWithFloat:width]];
  35. [heightArray addObject:[NSNumber numberWithFloat:height]];
  36.  
  37. NSDictionary *timeDic = [info objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];
  38. CGFloat time = [[timeDic objectForKey:(__bridge NSString *)kCGImagePropertyGIFDelayTime]floatValue];
  39. allTime += time;
  40. [timeArray addObject:[NSNumber numberWithFloat:time]];
  41. }
  42. dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
  43. }

3.加载 GIF

timingFunction: 控制动画运行的节奏
  • kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
  • kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
  • kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
  • kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为
  1. #pragma mark -- 加载 GIF
  2. - (void)cc_setImage:(NSURL *)imageUrl {
  3. __weak id _self = self;
  4. [self gifWithUrl:imageUrl returnData:^(NSArray<UIImage *> *imageArray, NSArray<NSNumber *> *timeArray, CGFloat totalTime, NSArray<NSNumber *> *widths, NSArray<NSNumber *> *heights) {
  5.  
  6. CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
  7. NSMutableArray * times = [[NSMutableArray alloc]init];
  8. float currentTime = ;
  9. //设置每一帧的时间占比
  10. for (int i = ; i < imageArray.count; i++) {
  11. [times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
  12. currentTime += [timeArray[i] floatValue];
  13. }
  14. [animation setKeyTimes:times];
  15. [animation setValues:imageArray];
  16. [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
  17. //设置循环
  18. animation.repeatCount= MAXFLOAT;
  19. //设置播放总时长
  20. animation.duration = totalTime;
  21. //Layer层添加
  22. [[(UIImageView *)_self layer]addAnimation:animation forKey:@"gifAnimation"];
  23. }];
  24. }

iOS 学习 - 25 ImageIO 播放 GIF的更多相关文章

  1. ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件

    首先要导入AVFoundation框架及 #import <AVFoundation/AVFoundation.h>头文件 注意:要在真机上调试 下面是ipad上的调试效果 下面是代码,代 ...

  2. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  3. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  6. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  7. iOS学习网站及大牛网址(实时更新)

    iOS学习网站及大牛网址(实时更新) 学习网站 https://github.com/Tim9Liu9/TimLiu-iOS  自己总结的iOS.mac开源项目及库 https://github.co ...

  8. IOS学习之IOS沙盒(sandbox)机制和文件操作

    IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...

  9. 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据

    原文:  http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...

随机推荐

  1. 取消vs2013在solution中单击打开文件的功能

    2013用了一段时间,不错,就是单击会打开文件,有点恼人(因人而异吧).解决方案: 取消红色框框里面的那个checkbox就ok了. 来自为知笔记(Wiz)

  2. tomcat:there is no resources that can be added or removed from server

    原因: 1.不是web project 解决方式:project-->property--project facet 新建或者修改 2. 版本不兼容 升级tomcat版本

  3. C# Excel 为图表添加模拟运算表

    Excel中的图表能够将数据可视化,方便我们比较分析数据.但也有一定的局限,例如:不能够直接从图表中读出原来数据的准确值.Excel提供的解决方案是,在图表下方添加一个模拟运算表,即在坐标轴下方添加包 ...

  4. Opencv VideoCapture实时捕捉摄像头信息

    #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using ...

  5. 大型网站提速关键技术(页面静态化,memcached,MySql优化)(三)

    页面静态化的技术实现有两种方式 使用PHP自己的缓存机制 先说明一下OB缓存的机制. ob1.php 代码:说明的ob的各个用法->项目中 ☞ 如何打开ob缓存 ①     配置php.ini ...

  6. CSS魔法堂:重拾Border之——图片作边框

    前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...

  7. 在ASP.NET Core中怎么使用HttpContext.Current

    一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...

  8. 分离的思想结合单链表实现级联组件:CascadeView

    本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...

  9. WinForm 窗体属性 窗体美化

    WinForm是·Net开发平台中对Windows Form的一种称谓. Windows窗体的一些重要特点如下: 功能强大:Windows窗体可用于设计窗体和可视控件,以创建丰富的基于Windows的 ...

  10. C#中IList与List

    C#中IList<T>与List<T>的区别感想 写代码时对: IList IList11 =new List (); List List11 =new List (); 有所 ...