IOS gif图片播放 swift

  • 1. GIF在iOS平台上的几种加载方式
  • 2. 第三方开源框架播放GIF
    • 1. SDWebImage播放:
    • 2. Kingfisher播放:
  • 3. 自己实现加载GIF
    • 3.1 GIF的分解
    • 3.2 简单GIF拆解后通过动画播放
    • 3.3 封装GIF播放UIImage分类扩展

1. GIF在iOS平台上的几种加载方式

  • 使用DispatchSource创建定时器播放gif图
  • 使用UIImageView直接展示
  • 基于Timer定时器的逐帧动画效果
  • 基于CADisplaylink的逐帧动画效果
  • 使用WebView直接加载gif图

2. 第三方开源框架播放GIF

1. SDWebImage播放:

  1. SDWebImage方法:
      let imageView = UIImageView(frame: CGRect(x:0, y:0, width: BGVIEW_WIDTH, height: BGVIEW_WIDTH))    imageView.image=UIImage.sd_animatedGIF(with: gifDataas!Data)

2. Kingfisher播放:

  1. Kingfisher(Kingfisher源码下载):直接用加载网络的方法加载即可
 let path =Bundle.main.path(forResource:"loading", ofType:"gif")       let image =UIImageView(frame: CGRect(x:0, y:0, width: BGVIEW_WIDTH, height: BGVIEW_WIDTH))        image.kf.setImage(with:ImageResource(downloadURL:URL(fileURLWithPath: path!)))

3. 自己实现加载GIF

3.1 GIF的分解

GIF分解分为几个步骤:

  1. 将GIF图片转为Data
  2. 使用ImageIO根据Data获取图片的帧数,时间间隔等信息
  3. 根据时间播放图片

3.2 简单GIF拆解后通过动画播放

  1. swift 播放代码如下:
import UIKit
import ImageIOclass ViewController: UIViewController {@IBOutlet weak var imageView: UIImageView!override func viewDidLoad() {super.viewDidLoad()// 加载Gif图片, 并且转成Data类型,"my.gif就是gif图片"guard let path = Bundle.main.path(forResource: "my.gif", ofType: nil) else { return }guard let data = NSData(contentsOfFile: path) else { return }// 从data中读取数据: 将data转成CGImageSource对象guard let imageSource = CGImageSourceCreateWithData(data, nil) else { return }let imageCount = CGImageSourceGetCount(imageSource)// 便利所有的图片var images = [UIImage]()var totalDuration : TimeInterval = 0for i in 0..<imageCount {// .取出图片guard let cgImage = CGImageSourceCreateImageAtIndex(imageSource, i, nil) else { continue }let image = UIImage(cgImage: cgImage)if i == 0 {imageView.image = image}images.append(image)// 取出持续的时间guard let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, i, nil) else { continue }guard let gifDict = (properties as NSDictionary)[kCGImagePropertyGIFDictionary] as? NSDictionary else { continue }guard let frameDuration = gifDict[kCGImagePropertyGIFDelayTime] as? NSNumber else { continue }totalDuration += frameDuration.doubleValue}// 设置imageView的属性imageView.animationImages = imagesimageView.animationDuration = totalDurationimageView.animationRepeatCount = 0// 开始播放imageView.startAnimating()}
}

3.3 封装GIF播放UIImage分类扩展

  1. 图片路径在沙盒中:
 let filepath =  NSHomeDirectory() + "/Documents/launchGif.gif"self.launchImage.kyl_startGifWithFilePath(filePath: filepath)
  1. 图片放在工程中:
self.launchImage.kyl_startGifWithImageName(name: "launchGif.gif")
  1. UIImage 扩展gif类的方法:
extension UIImage {//MARK:工程内gifpublic func kyl_startGifWithImageName(name:String){guard let path = Bundle.main.path(forResource: name, ofType: "gif") else {print("SwiftGif: Source for the image does not exist")return}self.kyl_startGifWithFilePath(filePath: path)}//MARK:实现动图效果public func kyl_startGifWithFilePath(filePath:String) {//1.加载GIF图片,并转化为data类型guard let data = NSData(contentsOfFile: filePath) else {return}//2.从data中读取数据,转换为CGImageSourceguard let imageSource = CGImageSourceCreateWithData(data, nil) else {return}let imageCount = CGImageSourceGetCount(imageSource)//3.遍历所有图片var images = [UIImage]()var totalDuration : TimeInterval = 0for i in 0..<imageCount {//3.1取出图片guard let cgImage = CGImageSourceCreateImageAtIndex(imageSource, i, nil) else {continue}let image = UIImage(cgImage: cgImage)images.append(image)//3.2取出持续时间guard let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, i, nil) as? NSDictionary  else {continue}guard let gifDict = properties[kCGImagePropertyGIFDictionary]  as? NSDictionary else  {continue}guard let frameDuration = gifDict[kCGImagePropertyGIFDelayTime] as? NSNumber else {continue}totalDuration += frameDuration.doubleValue}//4.设置imageview的属性self.animationImages = imagesself.animationDuration = totalDurationself.animationRepeatCount = 0//5.开始播放self.startAnimating()}public func kyl_imageStopAnimating() {self.stopAnimating()}
}

参考大神博客:
https://www.jianshu.com/p/ea145cac1f5f

IOS gif图片播放 swift相关推荐

  1. Swift实现iOS录音与播放音频功能

    Swift实现iOS录音与播放音频功能 作用 AVPLayer:可以用来播放在线及本地音视频 AVAudioSession:音频会话,主要用来管理音频设置与硬件交互 使用时需要导入 #import & ...

  2. iOS 9音频应用播放音频之iOS 9音频播放进度

    iOS 9音频应用播放音频之iOS 9音频播放进度 iOS 9音频应用开发播放进度 音频文件在播放后经过了多久以及还有多久才可以播放完毕,想必是用户所关注的问题.为了解决这一问题,在很多的音乐播放器中 ...

  3. iOS开发--音频播放、录音、视频播放、拍照、视频录制

    概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像 ...

  4. veImageX 演进之路:iOS 高性能图片加载 SDK

    动手点关注 干货不迷路 1.  SDK简介 图片在业务应用场景是一个常见的元素,veImageX(简称ImageX)为业务提供了灵活.高效的一站式图片处理解决方案,包括了服务端 SDK.上传 SDK ...

  5. iOS开发-图片离线鉴黄 基于TensorFlow nsfw oc版

    iOS开发-图片离线鉴黄 基于TensorFlow nsfw oc版 前言-基于TensorFlow鉴黄 效果 首先要引入Firebase 鉴黄类的封装 OC版本的鉴黄demo Swift版本的鉴黄 ...

  6. iOS开发图片格式选择

    图片是如何显示的 在讲解如何选择图片格式之前,我感觉有必要先了解下,图片是如何展示的.如果我们要展示一张图片,一般步骤是这样的: /// Assets.xcassets中的图片,不需要后缀 let i ...

  7. IOS AVAudioPlayer 音频播放

    IOS AVAudioPlayer 音频播放 要给工程中添加音频,首先要导入音频的框架 AVFoundation.framework 然后新建一个类继承于UIViewController, 我这里就叫 ...

  8. jquery图片播放切换插件

    点击这里查看效果 可自定义数字样式和左右点击按钮 这个更好: 移入按钮切换版本 更多图片轮播 以下是HTML文件代码: 1 <!DOCTYPE html PUBLIC "-//W3C/ ...

  9. jQuery图片播放插件prettyPhoto使用介绍

    演示效果  http://www.17sucai.com/preview/131993/2014-07-09/mac-Bootstrap/gallery.html 点击之后的效果 使用方法 Query ...

最新文章

  1. Machine Learning | (2) sklearn数据集与机器学习组成
  2. SAP EWM - 存储类型 - 入库控制
  3. ajax校验用户名可用吗,基于jQuery实现Ajax验证用户名是否可用实例
  4. 038_Steps步骤条
  5. epoll的LT和ET模式
  6. 贷款为什么要查看征信?
  7. 点阵字体显示系列补记2:关于24点阵汉字显示程序及其修改版本
  8. Exchange误删除邮箱用户后恢复账户问题
  9. verilog实现多周期处理器之——(一)基本概念以及总体框架
  10. gdb调试动态链接so
  11. inDesign教程,如何将内容与参考线对齐?
  12. 利用Python实现Shp格式向GeoJSON的转换!
  13. VB程序设计—For循环结构
  14. 机器学习 --- 概率图 - 概述
  15. 跨平台即时通讯解决方案
  16. web前端基础——媒体查询
  17. 初学者如何学习好嵌入式开发?讲解嵌入式学习教程
  18. 陈丽莎计算机科学与技术专业,关于表彰我校成人高等学历教育2015届毕业生学习奖和优秀学生干部获奖者的通知...
  19. 读书笔记:《置身事内》
  20. 使用vue扫描扫描仪图像

热门文章

  1. 第1章 人机交互与用户体验
  2. 今天面了个腾讯拿30k出来的,真是小母牛按门铃,牛逼到家了
  3. java对象转xml文件
  4. 查看oracle版本命令
  5. Eclipse 新建WEB工程的WebContent目录设置默认WebRoot,和设置编译class默认输出WebRoot\WEB-INF\classes
  6. 投资理财之基金一、初识基金
  7. 中国银河证券公募基金分类体系的理论依据与规则基础
  8. 织梦++高级搜索php,织梦多条件筛选功能实现(dede联动搜索) - DeDecms
  9. 【uni-app】Hbuilder打包h5发行到web服务器
  10. IDEA怎么开两个编辑窗口