美文网首页图片相关
ImageIO - CGImageAnimation iOS原生

ImageIO - CGImageAnimation iOS原生

作者: 流星企盼 | 来源:发表于2020-01-20 20:14 被阅读0次

一直以来,iOS显示动图都是一件很麻烦的事情,鉴于手写代码的繁琐,借助第三方几乎时不可避免的事情,然而从现在开始,苹果的ImageIO/CGImageAnimation提供了原生的动图图片解析和播放。

Demo

先看具体的使用,基本上就一行代码

import ImageIO

let imageView = UIImageView();

if let gifURL = Bundle.main.url(forResource: "aImage", withExtension: "gif") {
    // 使用GIF的URL加载动图
    let gifCURL = gifURL as CFURL
    CGAnimateImageAtURLWithBlock(gifCURL, nil) { (index, image, stop) in
        imageView.image = UIImage(cgImage: image)
    }
    
    // Or: 使用GIF的Data加载动图
    do {
        let gifData = try Data(contentsOf: gifURL)
        let gifCData = gifData as CFData
        CGAnimateImageDataWithBlock(gifCData, nil) { (index, image, stop) in
            imageView.image = UIImage(cgImage: image)
        }
    } catch _ {
        
    }
}

详解

API

接下来,详细说一下相关的API

  • @available(iOS 13.0, *) iOS 13 系统起可用
  • 相关API仅支持GIFAPNG格式的图片
public typealias CGImageSourceAnimationBlock = (Int, CGImage, UnsafeMutablePointer<Bool>) -> Void

public func CGAnimateImageAtURLWithBlock(_ url: CFURL, _ options: CFDictionary?, _ block: @escaping CGImageSourceAnimationBlock) -> OSStatus

public func CGAnimateImageDataWithBlock(_ data: CFData, _ options: CFDictionary?, _ block: @escaping CGImageSourceAnimationBlock) -> OSStatus

方法仅传入动图的URL地址或二进制数据Data即可,当然因为是c函数,要转成CFURLCFData

CGImageSourceAnimationBlock

CGImageSourceAnimationBlock 参数分别为

  • index
    当前显示帧的索引

  • image
    当前的图片

  • stop
    是否是最后一张图

options

options是播放动态时的额外的配置,有三个Key

  • kCGImageAnimationStartIndex
    动图从第几帧开始播放,默认是0

  • kCGImageAnimationDelayTime
    动图每帧之间的间隔,会覆盖动图原有的间隔(动图原有的每帧之间的时间间隔可以不同,这个属性会统一成同一间隔)

  • kCGImageAnimationLoopCount
    动图的循环次数,会覆盖动图原有的循环次数(一般是无限次)

OSStatus

调用的返回结果,成功时为0。以下是一些调用失败时可以使用的枚举CGImageAnimationStatus

public enum CGImageAnimationStatus : OSStatus {

    case parameterError /* NULL or invalid parameter passed to API */

    case corruptInputImage /* An image cannot be read from the given source */

    case unsupportedFormat /* The image format is not applicable to animation */

    case incompleteInputImage /* An image can be read from the given source, but it is incomplete */

    case allocationFailure /* A required resource could not be created */
}

相关文章

网友评论

    本文标题:ImageIO - CGImageAnimation iOS原生

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