web-dev-qa-db-ja.com

UIImageViewでのiOS 11アニメーションgif表示

IOS 11は、ついに、アニメーションGIFをネイティブでサポートするようになると思いましたか?しかし、私はこれを試してみましたが、アニメーションは表示されませんでした:

let im = UIImage(named:"wireframe.gif")!
let iv = UIImageView(image:im)
iv.animationImages = [im] // didn't help
iv.frame.Origin = CGPoint(0,100)
iv.frame.size = im.size
self.view.addSubview(iv)
delay(2) {
    iv.startAnimating() // nope
}

これはどのように機能するはずですか?

12
matt

iOS 11はアニメーションgifのネイティブな理解をもたらしますが、その理解は、腹立たしいことに、UIImageViewに組み込まれていません。アニメーションgifを一連のUIImageに変換するのはあなたです。 Appleは、ImageIOフレームワークに関して、サンプルコードを提供します。

https://developer.Apple.com/library/content/samplecode/UsingPhotosFramework/Listings/Shared_AnimatedImage_Swift.html

そのコードは、AnimatedImageクラスを実装します。これは、元のアニメーションgifから抽出されたCGImageのコレクションです。したがって、そのクラスを使用すると、次のようにUIImageViewでアニメーションgifを表示およびアニメーション化できます。

let url = Bundle.main.url(forResource: "wireframe", withExtension: "gif")!
let anim = AnimatedImage(url: url)!
var arr = [CGImage]()
for ix in 0..<anim.frameCount {
    arr.append(anim.imageAtIndex(index: ix)!)
}
var arr2 = arr.map {UIImage(cgImage:$0)}
let iv = UIImageView()
iv.animationImages = arr2
iv.animationDuration = anim.duration
iv.frame.Origin = CGPoint(0,100)
iv.frame.size = arr2[0].size
self.view.addSubview(iv)
delay(2) {
    iv.startAnimating()
}
15
matt

残念ながら、GIFのフレーム間タイミングはフレーム間で異なる可能性があるため、ImageIOを使用してフレームをロードし、UIImageViewのアニメーション画像として設定する回答では、タイミングを適切に抽出して考慮する必要があります。

GIFを正しく処理するFlipboardのFLAnimatedImageをお勧めします。 https://github.com/Flipboard/FLAnimatedImage

1
Ian Wilkinson