美文网首页
iOS 单次播放GIF图片

iOS 单次播放GIF图片

作者: 庞仕山 | 来源:发表于2017-06-22 14:51 被阅读1969次

    引言:我们在用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

    相关文章

      网友评论

          本文标题:iOS 单次播放GIF图片

          本文链接:https://www.haomeiwen.com/subject/iydfcxtx.html