在 iOS 开发中,我们常使用 SDK 中的 UIImageView 显示图片,使用 UIImage 解码图片文件或数据,其支持 PNG, JEPG, BMP, GIF 等格式。其中 GIF 图片不支持动画。

如果中 iOS 中显示 GIF 动画图片,则需要自己实现。具体实现方式很简单,使用 SDK 中的 Image I/O framework 解码图片,读取 GIF 动画图片的帧数,显示时间。

然后使用 SDK 中的 quartzcore framework 中的 core animation 的 CAKeyFrameAnimation 类对 CALayer 执行动画。

1. 解码图片,在  iOS Create an CGImageSource 文章已经介绍了如何使用 Image I/O framework 进行图片解码。

2. 读取 GIF 动画图片的每一帧图片及显示时间,并保存成数组:

size_t imageCount = CGImageSourceGetCount(cImageSource);NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:imageCount];NSMutableArray *times = [[NSMutableArray alloc] initWithCapacity:imageCount];NSMutableArray *keyTimes = [[NSMutableArray alloc] initWithCapacity:imageCount];float totalTime = 0;for (size_t i = 0; i < imageCount; i++) {CGImageRef cgimage= CGImageSourceCreateImageAtIndex(cImageSource, i, NULL);[images addObject:(__bridge id)cgimage];CGImageRelease(cgimage);NSDictionary *properties = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(cImageSource, i, NULL);NSDictionary *gifProperties = [properties valueForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary];NSString *gifDelayTime = [gifProperties valueForKey:(__bridge NSString* )kCGImagePropertyGIFDelayTime];[times addObject:gifDelayTime];totalTime += [gifDelayTime floatValue];_size.width = [[properties valueForKey:(NSString*)kCGImagePropertyPixelWidth] floatValue];_size.height = [[properties valueForKey:(NSString*)kCGImagePropertyPixelHeight] floatValue];}float currentTime = 0;for (size_t i = 0; i < times.count; i++) {float keyTime = currentTime / totalTime;[keyTimes addObject:[NSNumber numberWithFloat:keyTime]];currentTime += [[times objectAtIndex:i] floatValue];}

3. 执行 CAKeyFrameAnimation 动画

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];[animation setValues:images];[animation setKeyTimes:keyTimes];animation.duration = totalTime;animation.repeatCount = HUGE_VALF;[self.layer addAnimation:animation forKey:@"gifAnimation"];

完成!

iOS GIF 格式动画 图片显示相关推荐

  1. webp 格式的图片显示异常

    webp介绍 WebP,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,能节省大量的服务器带宽资源和数据空间. webp转换 右键点击 ...

  2. c android显示gif动画,MFC显示GIF动画图片

    本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件  GifPicture.rar (138.1 K ...

  3. 关于IOS中uni.downloadFile下载的图片显示不出来的解决方法

    1.如果你遇到的下载后的返回路径是如下情况的 2.此时IOS有可能会出现图片显示不出来(我自己手机测试是显示不出来) 3.针对此情况,我们可以在IOS端下进行单独处理,使用escape escape( ...

  4. c语言头文件格式图片_阿波罗 STM32F767 开发板资料连载第四十九章 图片显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第四十九章 图片显示实验 ...

  5. 【正点原子STM32连载】第四十八章 图片显示实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. 解决 .webp 格式图片在 ios 设备上无法正常显示的问题

    解决.webp 格式图片在 ios 设备上无法正常显示的问题 使用字符串的 replace() 方法,将 webp 的后缀名替换为 jpg 的后缀名 // 定义请求商品详情数据的方法 async ge ...

  7. 疯狂ios讲义疯狂连载之显示动画

    UIImage专门用于显示各种位图该类支持表12.1所示的各种图片格式. 当系统内存紧张时UIImage会将图片数据从UIImage对象中清理出去来以节省系统内存这里的清理行为只是清理UIImage内 ...

  8. 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

    文章目录 一. 代码生成控件 1. 创建设置项目 ( 1 ) 创建项目 ( ① 选择 Create a new Xcode project | ② 创建 Single View Application ...

  9. APNG面向移动与未来的新动画图片格式揭秘与制作全技巧

    动画应用的五个阶段 第一阶段:上古阶段 第二阶段:轻应用阶段 第三阶段:脚本动画时代 第四阶段:富媒体精细呈现阶段 矢量脚本动画的集大成者-Bodymovin和Lottie APNG方案 什么是apn ...

最新文章

  1. Cisco实物图片库2
  2. 为什么文件会自动恢复成旧文件? -- windows server 2003
  3. centos图形界面的开启和关闭
  4. 【AI视野·今日Robot 机器人论文速览 第十一期】Mon, 21 Jun 2021
  5. android微信条码支付接口,Android中调用微信支付接口
  6. 解决安装CMake报错:Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly.
  7. c#和python同一主机直接udp_Python 第十一章:面向对象编程(上)!(系列发布)...
  8. 【SICP练习】71 练习2.42
  9. android 出现在默认应用程序,如何将我的应用程序设置为默认的SMS应用程序?
  10. MyEclipse查看.class文件
  11. 使用 classList API
  12. Hibernate(六):映射一对多关联关系、双向一对多映射
  13. Android全局变量使用
  14. maven-maven使用-P参数打包不同环境
  15. go1.15版本 mod 报An existing connection was forcibly closed by the remote host错误处理
  16. python遍历文件夹以及排序问题
  17. 产品读书《魔鬼经济学3:用反常思维解决问题》
  18. Conflux 联合创始人、CTO伍鸣博士出席杭州钱江世纪城重点发展企业座谈会
  19. linux 命令 curl 详解
  20. jQuery获得当前元素id

热门文章

  1. 工地人员定位系统解决方案
  2. android测试环境搭建
  3. 你们的老朋友又来啦!来听小强讲视频超分辨率算法前沿进展
  4. html5单屏滚动页面案例,20个精巧走心的单页滚动网页设计案例
  5. jep使用_JEP 374:禁用和弃用偏向锁定
  6. MIUI7 系统应用精简(米5、红米note3)
  7. vim cscope java_【转】Cscope的使用(领略Vim + Cscope的强大魅力)
  8. Junction.exe 命令应用详解
  9. 云+社区【玩转腾讯云】征文活动,COSCI更有额外奖励
  10. Mac下mysql忘记密码解决方法