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


Я думал, что 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
}

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

2 10

2 ответа:

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

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

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