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 ответа:
IOS 11 действительно приносит родное понимание анимированных GIF-файлов, но это понимание, к сожалению, не встроено в UIImageView. Это все еще зависит от вас, чтобы перевести анимированный gif в последовательность UIImages. Apple теперь предоставляет пример кода, в терминах фреймворка ImageIO:
Этот код реализует класс 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 .