高性能且易于使用的 Gif 引擎
语言切换: 한국어
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
pod 'SwiftyGif'
按照通常的 Carthage 指示,将 框架添加到应用程序。在 Cartfile
中添加 SwiftyGif 框架时,请应用其 GitHub 仓库语法
github "kirualex/SwiftyGif"
https://github.com/kirualex/SwiftyGif.git
目前,Xcode 的 xcassets
文件夹不将 .gif
识别为图片。 这意味着您需要将您的 .gif
放在 assets 之外。 我建议创建一个组,例如 gif
。
SwiftyGif 使用熟悉的 UIImage
和 UIImageView
来显示 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)
}
@IBOutlet var myImageView : UIImageView!
...
let gif = try UIImage(gifName: "MyImage.gif")
self.myImageView.setGifImage(gif, loopCount: -1) // Will loop forever
// 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)
将此 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")
}
}
CPU 使用率(平均) | 内存使用率(平均) | |
---|---|---|
FLAnimatedImage | 35% | 9,5Mb |
SwiftyGif | 2% | 18,4Mb |
SwiftyGif(memoryLimit:10) | 34% | 9,5Mb |
CPU 使用率(平均) | 内存使用率(平均) | |
---|---|---|
FLAnimatedImage | 65% | 25,1Mb |
SwiftyGif | 22% | 105Mb |
SwiftyGif(memoryLimit:20) | 45% | 26Mb |
在 iPhone 6S、iOS 9.3.1 和 Xcode 7.3 上测量。