iOS 单次播放GIF图片

引言:我们在用SDWebImage的时候, 如果图片是.gif的时候,是自动无限循环播放的,而如果我们只需要播放有限次数gif图的时候,是没有办法的,接下来让我们看看不用第三方如何播放gif图吧。
Demo下载


首先,UIImageView是存在播放一组图片的功能的,而.gif的图片,也是一组图片组成的, 我们需要把gif图分解成一组图片;
第二步,拿到一组图片之后,我们还需要知道gif图片需要播放多久,就需要拿到时间信息;
第三步,当我们停止播放的时候,要显示哪一张图片,也需要给定的,不然停止播放的时候就会显示空白;
补充说明: gif图暂停的时候,是固定显示一张图片的。如果想做实时暂停,则本篇微博不会涉及。不过操作思路还是可以讲一下,就是拿到图片组;然后再拿到每张图片播放的时间,开一个定时器;然后根据时间的流逝显示图片,当点击暂停的时候定时器暂停,点击继续的时候定时器继续走,而不是用UIImageView提供的系统方法。定时器的话可以用CADisplayLink,比较精确,是根据屏幕刷新率来的,不过不了解可以自行搜索,也是不难的。虽然不提供此功能,但是,下面一部分的代码对你也是有一定的帮助的,看看就知道了,代码量也不是很大。(如果我哪天有闲暇时间,可能会写一个,到时候会发上链接的)

代码:

// 1.获取NSData类型
guard let filePath = Bundle.main.path(forResource: "demo.gif", ofType: nil) else { return }
guard let fileData = NSData(contentsOfFile: filePath) else { return }
        
// 2.根据Data获取CGImageSource对象
guard let imageSource = CGImageSourceCreateWithData(fileData, nil) else { return }
        
// 3.获取gif图片中图片的个数
let frameCount = CGImageSourceGetCount(imageSource)
// 记录播放时间
var duration : TimeInterval = 0
var images = [UIImage]()
for i in 0..<frameCount {
    // 3.1.获取图片
    guard let cgImage = CGImageSourceCreateImageAtIndex(imageSource, i, nil) else { continue }
    // 3.2.获取时长
    guard let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, i, nil) , let gifInfo = (properties as NSDictionary)[kCGImagePropertyGIFDictionary as String] as? NSDictionary,
    let frameDuration = (gifInfo[kCGImagePropertyGIFDelayTime as String] as? NSNumber) else { continue }
    duration += frameDuration.doubleValue
    let image = UIImage(cgImage: cgImage)
    images.append(image)
    // 设置停止播放时现实的图片
    if i == frameCount - 1 {
        imageView.image = image
    }
}
// 4.播放图片
imageView.animationImages = images
// 播放总时间
imageView.animationDuration = duration
// 播放次数, 0为无限循环
imageView.animationRepeatCount = 1
// 开始播放
imageView.startAnimating()
// 停止播放
// imageView.stopAnimating()

结束语:

以上代码是Swift的,不过需要用OC,可以自己翻译成OC,代码量也不大。如果一个iOS开发者读不懂这点Swift的代码的话,你的知识储备该提高了,赶紧去学啊少年!
如果懒得翻译,也可以用OC混编Swift,封装一下,照样用。最后再次附上下载地址(戳这里下载Demo啊)

如果对你有帮助,点个Star呗
同时也欢迎评论中指出本文存在的bug,或者疑问,互相促进!
作者邮箱:pangshishan@aliyun.compangshishan1@163.com
github地址:https://github.com/Pangshishan
qq/微信: 704158807

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,650评论 4 61
  • 忘了从什么时候开始 对记录文字莫名的专心致志 从书本里划线的句子 到后来自己尝试写些幼稚的词 反复删减许多如今看来...
    3year阅读 276评论 2 3
  • 国庆假期结束了,那么今年国庆档电影的票房之冠也基本已定乾坤,同时今年国庆档票房也创下了以往历史性的10年首次下跌,...
    郑力帅阅读 350评论 0 1
  • 在昨天我学过画画之后往家里赶的时候发现爸爸在我们画画室的门口等我这我和我的爸爸一起骑行回家。到我们小区门口的时候。...
    小溪流10李腾木阅读 378评论 1 4
  • 时光匆匆,曾经那群围在我身边叫我姐姐的小弟弟如今都有了女朋友。 记得瑞瑞的女朋友还是在初中时就有了,我见证了他...
    雪儿love2017阅读 308评论 0 0

友情链接更多精彩内容