记录一个iOS 加载本地gif格式图片的方法


项目中需要加载本地gif图片,一开始使用的是SDWebImage框架的

  • (nullable UIImage *)sd_imageWithGIFData:(nullable NSData *)data;

但是在部分机型上出现了gif不能正常显示的问题(这里是iPhone 6s,iOS 12.4), 然后更换加载方式,使用腾讯的QMUIKit框架进行加载,使用方法

  • (UIImage *)qmui_animatedImageWithData:(NSData *)data scale:(CGFloat)scale

发现还是无法正常显示, 于是查看了qmui_animatedImageWithData:(NSData *)data scale:(CGFloat)scale的实现源码

  • (UIImage *)qmui_animatedImageWithData:(NSData *)data scale:(CGFloat)scale {
    // http://www.jianshu.com/p/767af9c690a3
    // https://github.com/rs/SDWebImage
    if (!data) {
    return nil;
    }
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    size_t count = CGImageSourceGetCount(source);
    UIImage *animatedImage = nil;
    if (count <= 1) {
    animatedImage = [[UIImage alloc] initWithData:data];
    } else {
    NSMutableArray<UIImage *> *images = [[NSMutableArray alloc] init];
    NSTimeInterval duration = 0.0f;
    for (size_t i = 0; i < count; i++) {
    CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
    duration += [self qmui_frameDurationAtIndex:i source:source];
    UIImage *frameImage = [UIImage imageWithCGImage:image scale:scale == 0 ? ScreenScale : scale orientation:UIImageOrientationUp];
    [images addObject:frameImage];
    CGImageRelease(image);
    }
    if (!duration) {
    duration = (1.0f / 10.0f) * count;
    }
    animatedImage = [UIImage animatedImageWithImages:images duration:duration];
    }
    CFRelease(source);
    return animatedImage;
    }

查看了注释中的简书和github,最后采用如下方式加载

// #import "UIImageView+Gif.h" //给imageView添加category- (void)at_setGifImageWithGifFile:(NSString *)file animationDuration: (CGFloat)duration{NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:file withExtension: @"gif"]; //加载GIF图片CGImageSourceRef gifSource = CGImageSourceCreateWithURL((CFURLRef) fileUrl, NULL);           //将GIF图片转换成对应的图片源size_t frameCout = CGImageSourceGetCount(gifSource);                                         //获取其中图片源个数,即由多少帧图片组成NSMutableArray *frames = [[NSMutableArray alloc] init];                                    //定义数组存储拆分出来的图片for (size_t i = 0; i < frameCout; i++) {CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i, NULL); //从GIF图片中取出源图片UIImage *imageName = [UIImage imageWithCGImage:imageRef];                  //将图片源转换成UIimageView能使用的图片源[frames addObject:imageName];                                              //将图片加入数组中CGImageRelease(imageRef);}CFRelease(gifSource);self.animationImages = frames; //将图片数组加入UIImageView动画数组中self.animationDuration = duration; //每完成一次动画时长[self startAnimating];         //开启动画}

这样使用在UITableView或者UICollection等列表中加载可能会出现问题,可尝试以下方法解决

if (!<#imageView#>.isAnimating) {[<#imageView#> startAnimating];
}

参考文档:
简书、github

iOS 加载本地Gif图片相关推荐

  1. iOS 加载本地HTML文件,图片没显示出来的问题

    iOS 加载本地HTML文件,图片没显示出来的问题,一般都是路径的问题.在HTML中,用的是绝对路径类似,而在项目中,一般 都是相对路径.例如:在HTML中, src="images/qq. ...

  2. Unity for IOS 加载手机相册图片以及打开相机拍照获取图片

    Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...

  3. iOS WebView 加载本地资源(图片,文件等)

    NSString *path = [[NSBundle mainBundle] pathForResource:@"关于.docx" ofType:nil]; NSURL *url ...

  4. ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript

    我尝试在WKWebView上使用javascript加载本地HTML游戏.虽然我可以看到由CSS设计的HTML页面,但我听不到游戏的任何声音和一些游戏的动作不对应. 我注意到,如果我通过http直播服 ...

  5. ios加载本地游戏html,iOS WebView加载本地HTML代码

    项目需求: 去服务器获取代码包到本地保存,然后去加载本地的代码包.这样的话,如果有新的版本更新,就直接更新html的代码包,就不用更新ipa包了. 需要注意几点: 1.代码存在服务器,zip格式 2. ...

  6. ios 加载本地html及资源文件

    把本地html目录添加到xcode html资源显示蓝色文件夹 WKWebView加载本地html资源 NSString *filePath = [[NSBundle mainBundle] path ...

  7. ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法

    IOS开发中加载大量网络图片如何优化 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着 ...

  8. AsyncLoadLocalImage ios 加载本地高清大图

    如果你的iOS项目中需要加载项目中或者沙盒中的多张高清大图时,希望这个框架能助你一臂之力. If your iOS project needs to be loaded multi high qual ...

  9. iOS 加载本地html文件详细操作

    webView的加载,如果是纯文本,有内部样式的话,简单的加载请求就可以了.如下: 这种加载简单直接,易操作. 如果需要加载images,css文件 需要把xcode的项目请求路径的位置告诉webVi ...

  10. iOS 加载本地和网络gif 图片类扩展

    https://github.com/AlexanderYeah/GifKuoZhan [self.meiXueImgView showGifImageWithData:[NSData dataWit ...

最新文章

  1. 只给测试集不给训练集,要怎么做自己的物体检测器?
  2. 有效感受野--Understanding the Effective Receptive Field in Deep Convolutional Neural Networks
  3. python 网页cookie的使用
  4. android cmd adb命令安装和删除apk应用
  5. 基于stm32f103zet6的DS1302学习
  6. 第一、二类斯特林(Stirling)数的生成函数(母函数)及推导
  7. 线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程...
  8. OpenCV-绘制简易直方图DrawHistImg
  9. 2019-11-25 编写cmake 脚本注意事项
  10. 88. cdata , dtd
  11. 大一c语言作业操作题库,c语言题目(大一c语言编程题库)
  12. 动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)
  13. Android Dex 分包+热修复(QQ空间技术方案)
  14. 启用特殊池解读 0x000000c5 蓝屏
  15. UTC相关的时区转换
  16. 51单片机计算机实物焊接,51单片机实验DIY焊电源--串口详细步骤
  17. ECCV 2022 | 稀有类别提升31%!如何解决3D检测中长尾问题?(Waymo最新)
  18. angular中copy和extend用法实例
  19. [How-to] Screen命令的使用
  20. 如何显示计算机语言栏,win10语言栏不见了,win7如何显示语言栏

热门文章

  1. 软件项目管理工具简介
  2. 汽车倒车雷达系统的设计与实现(二)
  3. MTK驱动移植相关路径
  4. 据说的屏蔽惠普增霸卡方法!
  5. 计算机打字怎么学笔,学电脑·非常简单:五笔打字
  6. matlab微积分如何计算器,利用matlab进行微积分的计算.pptx
  7. 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
  8. 通信原理包络是什么意思_自己总结的通信原理部分知识点
  9. 通信原理第六章思维导图
  10. nbu mysql linux备份软件,NBU备份linux/aix/unix下的db2数据库配置