Ajouter une image animée Gif dans Iphone UIImageView

Je dois charger une image Gif animée à partir d’une URL dans UIImageview.

Lorsque j’ai utilisé le code normal, l’image ne s’est pas chargée.

Existe-t-il un autre moyen de charger des images Gif animées?

UIImageView* animatedImageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; animatedImageView.animationImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"image1.gif"], [UIImage imageNamed:@"image2.gif"], [UIImage imageNamed:@"image3.gif"], [UIImage imageNamed:@"image4.gif"], nil]; animatedImageView.animationDuration = 1.0f; animatedImageView.animationRepeatCount = 0; [animatedImageView startAnimating]; [self.view addSubview: animatedImageView]; 

Vous pouvez charger plus d’une image gif.

Vous pouvez diviser votre fichier gif à l’aide de la commande ImageMagick suivante:

 convert +adjoin loading.gif out%d.gif 

Cela a trouvé une réponse acceptée, mais je suis récemment tombé sur l’ extension UIImage + animatedGIF UIImage. Il fournit la catégorie suivante:

 +[UIImage animatedImageWithAnimatedGIFURL:(NSURL *)url] 

vous permettant simplement:

 #import "UIImage+animatedGIF.h" UIImage* mygif = [UIImage animatedImageWithAnimatedGIFURL:[NSURL URLWithSsortingng:@"http://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif"]]; 

Fonctionne comme de la magie.

Voici la meilleure solution pour utiliser Gif Image. Ajoutez SDWebImage à partir de Github dans votre projet.

 #import "UIImage+GIF.h" _imageViewAnimatedGif.image= [UIImage sd_animatedGIFNamed:@"thumbnail"]; 

Vérifiez ce lien

https://github.com/mayoff/uiimage-from-animated-gif/blob/master/uiimage-from-animated-gif/UIImage%2BanimatedGIF.h

et importez ces clas UIImage + animatedGIF.h, UIImage + animatedGIF.m

Utilisez ce code

  NSURL *urlZif = [[NSBundle mainBundle] URLForResource:@"dots64" withExtension:@"gif"]; NSSsortingng *path=[[NSBundle mainBundle]pathForResource:@"bar180" ofType:@"gif"]; NSURL *url=[[NSURL alloc] initFileURLWithPath:path]; imageVw.image= [UIImage animatedImageWithAnimatedGIFURL:url]; 

J’espère que c’est utile

Cela ne répond pas à la nécessité d’utiliser un UIImageView, mais cela simplifierait peut-être les choses pour vous. Avez-vous envisagé d’utiliser un UIWebView?

 NSSsortingng *gifUrl = @"http://gifs.com"; NSURL *url = [NSURL URLWithSsortingng: gifUrl]; [webView loadRequest: [NSURLRequest requestWithURL:url] 

Si vous voulez, au lieu de lier à une URL qui nécessite Internet, vous pouvez importer un fichier HTML dans votre projet Xcode et définir la racine dans la chaîne.

Voici une bibliothèque intéressante: https://github.com/Flipboard/FLAnimatedImage

J’ai testé l’exemple de démonstration et cela fonctionne très bien. C’est un enfant de UIImageView. Donc, je pense que vous pouvez l’utiliser directement dans votre Storyboard.

À votre santé

Je sais qu’une réponse a déjà été approuvée, mais il est difficile de ne pas essayer de partager que j’ai créé un framework intégré qui ajoute le support Gif à iOS, comme si vous utilisiez une autre classe de structure UIKit.

Voici un exemple:

 UIGifImage *gif = [[UIGifImage alloc] initWithData:imageData]; anUiImageView.image = gif; 

Téléchargez la dernière version depuis https://github.com/ObjSal/UIGifImage/releases

– Sal

Si vous devez charger l’image gif depuis l’URL, vous pouvez toujours incorporer le gif dans une balise d’image dans une UIWebView .

Vous pouvez utiliser https://github.com/Flipboard/FLAnimatedImage

 #import "FLAnimatedImage.h" NSData *dt=[NSData dataWithContentsOfFile:path]; imageView1 = [[FLAnimatedImageView alloc] init]; FLAnimatedImage *image1 = [FLAnimatedImage animatedImageWithGIFData:dt]; imageView1.animatedImage = image1; imageView1.frame = CGRectMake(0, 5, 168, 80); [self.view addSubview:imageView1]; 

Swift 3:

Comme suggéré ci-dessus, j’utilise FLAnimatedImage avec un FLAnimatedImageView. Et je charge le gif en tant qu’dataset à partir de xcassets. Cela me permet de fournir différents gifs pour iphone et ipad à des fins d’apparence et de découpage d’applications. C’est beaucoup plus performant que tout ce que j’ai essayé. Il est également facile de faire une pause en utilisant .stopAnimating ().

 if let asset = NSDataAsset(name: "animation") { let gifData = asset.data let gif = FLAnimatedImage(animatedGIFData: gifData) imageView.animatedImage = gif } 

SWIFT 3

Voici la mise à jour pour ceux qui ont besoin de la version Swift!

Il y a quelques jours, je devais faire quelque chose comme ça. Je charge des données à partir d’un serveur en fonction de parameters spécifiques et en attendant je voulais afficher une image gif différente de “loading”. Je cherchais une option pour le faire avec un UIImageView mais malheureusement je n’ai pas trouvé quelque chose à faire sans diviser les images .gif. J’ai donc décidé d’implémenter une solution en utilisant un UIWebView et je souhaite le partager:

 extension UIView{ func animateWithGIF(name: Ssortingng){ let htmlSsortingng: Ssortingng = "< !DOCTYPE html>" + "" + "" + "" + "" let path: NSSsortingng = Bundle.main.bundlePath as NSSsortingng let baseURL: URL = URL(fileURLWithPath: path as Ssortingng) // to load images just specifying its name without full path let frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height) let gifView = UIWebView(frame: frame) gifView.isOpaque = false // The drawing system composites the view normally with other content. gifView.backgroundColor = UIColor.clear gifView.loadHTMLSsortingng(htmlSsortingng, baseURL: baseURL) var s: [UIView] = self.subviews for i in 0 ..< s.count { if s[i].isKind(of: UIWebView.self) { s[i].removeFromSuperview() } } self.addSubview(gifView) } func animateWithGIF(url: String){ self.animateWithGIF(name: url) } } 

J'ai créé une extension pour UIView qui ajoute un UIWebView tant que sous-vue et affiche les images .gif en passant simplement son nom.

Maintenant, dans mon UIViewController j'ai un UIView nommé "loadingView" qui est mon indicateur de "chargement" et chaque fois que je voulais afficher l'image .gif, j'ai fait quelque chose comme ceci:

 class ViewController: UIViewController { @IBOutlet var loadingView: UIView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) configureLoadingView(name: "loading.gif") } override func viewDidLoad() { super.viewDidLoad() // .... some code // show "loading" image showLoadingView() } func showLoadingView(){ loadingView.isHidden = false } func hideLoadingView(){ loadingView.isHidden = true } func configureLoadingView(name: Ssortingng){ loadingView.animateWithGIF(name: "name")// change the image } } 

Quand j'ai voulu changer l'image gif, j'ai simplement appelé la fonction configureLoadingView() avec le nom de ma nouvelle image .gif et en appelant showLoadingView() , hideLoadingView() correctement tout fonctionne bien!

MAIS...

... si l'image est fractionnée, vous pouvez l'animer sur une seule ligne avec une méthode statique UIImage.animatedImageNamed appelée UIImage.animatedImageNamed comme ceci:

imageView.image = UIImage.animatedImageNamed("imageName", duration: 1.0)

De la documentation:

Cette méthode charge une série de fichiers en ajoutant une série de nombres au nom de fichier de base fourni dans le paramètre name. Toutes les images incluses dans l'image animée doivent avoir la même taille et la même échelle.

Ou vous pouvez le faire avec la méthode UIImage.animatedImageWithImages comme ceci:

 let images: [UIImage] = [UIImage(named: "imageName1")!, UIImage(named: "imageName2")!, ..., UIImage(named: "imageNameN")!] imageView.image = UIImage.animatedImage(with: images, duration: 1.0) 

De la documentation:

Crée et renvoie une image animée à partir d'un ensemble d'images existant. Toutes les images incluses dans l'image animée doivent avoir la même taille et la même échelle.

Si vous connaissez la durée du fichier gif, vous n’avez pas besoin d’une bibliothèque tierce.

 extension UIImage { class func getImagesFromGIF(asset: Ssortingng) -> [UIImage]? { guard let dataAsset = NSDataAsset(name: asset) else { print("Cannot turn image named \"\(asset)\" into NSDataAsset") return nil } guard let source = CGImageSourceCreateWithData(dataAsset.data as CFData, nil) else { print("Source for the image does not exist") return nil } let count = CGImageSourceGetCount(source) var images = [UIImage]() for i in 0.. 

Pour utiliser cette extension,

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) DispatchQueue.global().async { if let images = UIImage.getImagesFromGIF(asset: "GIFFILENAME") { let gifDuration = 5.0 // need to change this DispatchQueue.main.async { self.imageView.animationImages = images self.imageView.animationDuration = gifDuration self.imageView.startAnimating() } } } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) imageView.stopAnimating() }