iOS 学习 - 25 ImageIO 播放 GIF
一、给原生的 UIImageView 添加类别来支持 GIF 播放
GIF 动态图片文件中包含了一组图片及信息,信息主要记录着每一帧图片播放的时间,我们如果获取到了 gif 文件中所有的图片同时又获取到每一帧图片播放的时间,就可以为 UIImageView 添加关键帧动画的方法让其播放 GIF 的内容了
1.新建一个 UIImageView 的类别
2.解析 GIF ,获得 GIF 的信息
- #pragma mark -- 解析 DGIF
- -(void)gifWithUrl:(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 = ;
- //存放所有图片
- NSMutableArray *imageArray = [NSMutableArray array];
- //存放每一帧播放的时间
- NSMutableArray *timeArray = [NSMutableArray array];
- //存放每张图片的宽度(一般在一个 gif 文件中,所有文件的尺寸都一样)
- NSMutableArray *widthArray = [NSMutableArray array];
- //存放每张图片的高度
- NSMutableArray * heightArray = [NSMutableArray array];
- //遍历
- for(size_t i = ;i < count; i++){
- //获取图片信息
- CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
- [imageArray addObject:(__bridge UIImage *)(image)];
- CGImageRelease(image);
- //获取图片信息
- NSDictionary *info = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, i, NULL);
- NSLog(@"%@",info);
- 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]];
- }
- dataBlock(imageArray,timeArray,allTime,widthArray,heightArray);
- }
3.加载 GIF
- kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
- kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
- kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
- kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为
- #pragma mark -- 加载 GIF
- - (void)cc_setImage:(NSURL *)imageUrl {
- __weak id _self = self;
- [self gifWithUrl: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 = ;
- //设置每一帧的时间占比
- for (int i = ; i < imageArray.count; i++) {
- [times addObject:[NSNumber numberWithFloat:currentTime/totalTime]];
- currentTime += [timeArray[i] floatValue];
- }
- [animation setKeyTimes:times];
- [animation setValues:imageArray];
- [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
- //设置循环
- animation.repeatCount= MAXFLOAT;
- //设置播放总时长
- animation.duration = totalTime;
- //Layer层添加
- [[(UIImageView *)_self layer]addAnimation:animation forKey:@"gifAnimation"];
- }];
- }
iOS 学习 - 25 ImageIO 播放 GIF的更多相关文章
- ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件
首先要导入AVFoundation框架及 #import <AVFoundation/AVFoundation.h>头文件 注意:要在真机上调试 下面是ipad上的调试效果 下面是代码,代 ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习网站及大牛网址(实时更新)
iOS学习网站及大牛网址(实时更新) 学习网站 https://github.com/Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库 https://github.co ...
- IOS学习之IOS沙盒(sandbox)机制和文件操作
IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...
- 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据
原文: http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...
随机推荐
- 取消vs2013在solution中单击打开文件的功能
2013用了一段时间,不错,就是单击会打开文件,有点恼人(因人而异吧).解决方案: 取消红色框框里面的那个checkbox就ok了. 来自为知笔记(Wiz)
- tomcat:there is no resources that can be added or removed from server
原因: 1.不是web project 解决方式:project-->property--project facet 新建或者修改 2. 版本不兼容 升级tomcat版本
- C# Excel 为图表添加模拟运算表
Excel中的图表能够将数据可视化,方便我们比较分析数据.但也有一定的局限,例如:不能够直接从图表中读出原来数据的准确值.Excel提供的解决方案是,在图表下方添加一个模拟运算表,即在坐标轴下方添加包 ...
- Opencv VideoCapture实时捕捉摄像头信息
#include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using ...
- 大型网站提速关键技术(页面静态化,memcached,MySql优化)(三)
页面静态化的技术实现有两种方式 使用PHP自己的缓存机制 先说明一下OB缓存的机制. ob1.php 代码:说明的ob的各个用法->项目中 ☞ 如何打开ob缓存 ① 配置php.ini ...
- CSS魔法堂:重拾Border之——图片作边框
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- 在ASP.NET Core中怎么使用HttpContext.Current
一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- WinForm 窗体属性 窗体美化
WinForm是·Net开发平台中对Windows Form的一种称谓. Windows窗体的一些重要特点如下: 功能强大:Windows窗体可用于设计窗体和可视控件,以创建丰富的基于Windows的 ...
- C#中IList与List
C#中IList<T>与List<T>的区别感想 写代码时对: IList IList11 =new List (); List List11 =new List (); 有所 ...