IOS 11 анимационный gif-дисплей в UIImageView

Я думал, что iOS 11 должен был, наконец, принести поддержку анимированных gifs? Но я пробовал это, и я не видел анимации:

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
}

Как это должно работать?

Ответ 1

iOS 11 действительно дает естественное понимание анимированных gif, но это понимание, беспричинно, не встроено в UIImageView. Вам все равно, чтобы перевести анимированный gif в последовательность UIImages. Теперь Apple предоставляет пример кода с точки зрения структуры ImageIO:

https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/Listings/Shared_AnimatedImage_swift.html

Этот код реализует класс AnimatedImage, который по существу представляет собой сборник CGImages, извлеченный из исходного анимированного gif. Таким образом, используя этот класс, мы можем отображать и анимировать анимированный gif в UIImageView следующим образом:

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()
}

Ответ 2

К сожалению, межкадровая синхронизация GIF может варьироваться между кадрами, поэтому ответы, которые используют ImageIO для загрузки фреймов, а затем устанавливают их как анимированные изображения в UIImageView, необходимо правильно извлечь тайминги и принять их во внимание.

Я рекомендую Flipboard FLAnimatedImage, который правильно обрабатывает GIF. https://github.com/Flipboard/FLAnimatedImage.