Language CocoaPods Compatible Carthage compatible Build Status Pod License

SwiftyGif

高性能且易于使用的 Gif 引擎


语言切换: 한국어

特性

安装

使用 CocoaPods

source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
pod 'SwiftyGif'

使用 Carthage

按照通常的 Carthage 指示,将 框架添加到应用程序。在 Cartfile 中添加 SwiftyGif 框架时,请应用其 GitHub 仓库语法

github "kirualex/SwiftyGif"

使用 Swift Package Manager

https://github.com/kirualex/SwiftyGif.git

如何使用

项目文件

projec-file-explain

目前,Xcode 的 xcassets 文件夹不将 .gif 识别为图片。 这意味着您需要将您的 .gif 放在 assets 之外。 我建议创建一个组,例如 gif

快速开始

SwiftyGif 使用熟悉的 UIImageUIImageView 来显示 gif。

通过代码

import SwiftyGif

do {
    let gif = try UIImage(gifName: "MyImage.gif")
    let imageview = UIImageView(gifImage: gif, loopCount: 3) // Will loop 3 times
    imageview.frame = view.bounds
    view.addSubview(imageview)
} catch {
    print(error)
}

直接从 nib/storyboard

@IBOutlet var myImageView : UIImageView!
...

let gif = try UIImage(gifName: "MyImage.gif")
self.myImageView.setGifImage(gif, loopCount: -1) // Will loop forever

远程 GIF

// You can also set it with an URL pointing to your gif
let url = URL(string: "...")
let loader = UIActivityIndicatorView(style: .white)
cell.gifImageView.setGifFromURL(url, customLoader: loader)

SwiftUI

将此 UIViewRepresentable 添加到您的代码。

struct AnimatedGifView: UIViewRepresentable {
    @Binding var url: URL

    func makeUIView(context: Context) -> UIImageView {
        let imageView = UIImageView(gifURL: self.url)
        imageView.contentMode = .scaleAspectFit
        return imageView
    }

    func updateUIView(_ uiView: UIImageView, context: Context) {
        uiView.setGifFromURL(self.url)
    }
}

然后使用它

AnimatedGifView(url: Binding(get: { myModel.gif.url }, set: { _ in }))

性能

一个 SwiftyGifManager 可以使用相同的内存池容纳一个或多个 UIImageView。 这允许您根据自己的需要调整内存限制。 如果没有声明管理器,SwiftyGif 将只使用 SwiftyGifManager.defaultManager

完整性级别

设置较低的完整性级别将允许跳过帧,从而降低 CPU 和内存使用量。 如果您需要同时预览大量 gif,这可能是一个不错的选择。

do {
    let gif = try UIImage(gifName: "MyImage.gif", levelOfIntegrity:0.5)
} catch {
    print(error)
}

控制

SwiftyGif 提供了对当前 UIImageView 播放 gif 文件的各种控制。

self.myImageView.startAnimatingGif()
self.myImageView.stopAnimatingGif()
self.myImageView.showFrameAtIndexDelta(delta: Int)
self.myImageView.showFrameAtIndex(index: Int)

为了方便使用这些控件,提供了一些实用方法

self.myImageView.isAnimatingGif() // Returns whether the gif is currently playing
self.myImageView.gifImage!.framesCount() // Returns number of frames for this gif

代理

您可以声明一个 SwiftyGifDelegate 来接收关于 gif 生命周期的更新。 例如,如果您希望您的控制器 MyController 充当代理

override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.delegate = self
}

然后只需添加一个扩展

extension MyController : SwiftyGifDelegate {

    func gifURLDidFinish(sender: UIImageView) {
        print("gifURLDidFinish")
    }

    func gifURLDidFail(sender: UIImageView) {
        print("gifURLDidFail")
    }

    func gifDidStart(sender: UIImageView) {
        print("gifDidStart")
    }
    
    func gifDidLoop(sender: UIImageView) {
        print("gifDidLoop")
    }
    
    func gifDidStop(sender: UIImageView) {
        print("gifDidStop")
    }
}

基准测试

显示 1 张图片

CPU 使用率(平均) 内存使用率(平均)
FLAnimatedImage 35% 9,5Mb
SwiftyGif 2% 18,4Mb
SwiftyGif(memoryLimit:10) 34% 9,5Mb

显示 6 张图片

CPU 使用率(平均) 内存使用率(平均)
FLAnimatedImage 65% 25,1Mb
SwiftyGif 22% 105Mb
SwiftyGif(memoryLimit:20) 45% 26Mb

在 iPhone 6S、iOS 9.3.1 和 Xcode 7.3 上测量。