web-dev-qa-db-fra.com

Affichage gif animé iOS 11 dans UIImageView

Je pensais qu'iOS 11 était censé apporter, enfin, un support natif pour les gifs animés? Mais j'ai essayé et je n'ai vu aucune animation:

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
}

Comment est-ce censé fonctionner?

12
matt

iOS 11 apporte une compréhension native des gifs animés, mais cette compréhension, exaspérante, n'est pas intégrée à UIImageView. C'est toujours à vous de traduire le gif animé en une séquence de UIImages. Apple fournit maintenant un exemple de code, en termes de framework ImageIO:

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

Ce code implémente une classe AnimatedImage, qui est essentiellement une collection de CGImages extraites du gif animé d'origine. Ainsi, en utilisant cette classe, nous pouvons afficher et animer le gif animé dans un UIImageView comme suit:

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

Malheureusement, le minutage inter-images d'un GIF peut varier entre les images, donc les réponses qui utilisent ImageIO pour charger les images puis les définir comme images animées sur un UIImageView doivent extraire correctement les synchronisations et les prendre en compte.

Je recommande FLAnimatedImage de Flipboard, qui gère correctement les GIF. https://github.com/Flipboard/FLAnimatedImage .

1
Ian Wilkinson