web-dev-qa-db-fra.com

Ajouter une image Gif animée 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?

72
Velmurugan
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 plusieurs images gif.

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

convert +adjoin loading.gif out%d.gif
133
Ishu

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 de simplement:

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

Fonctionne comme par magie.

50
Dom Vinyard

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

#import "UIImage+GIF.h"

_imageViewAnimatedGif.image= [UIImage sd_animatedGIFNamed:@"thumbnail"];
22
Arvind Kumar

Vérifiez ce lien

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

et importer ces classes UIImage + animatedGIF.h, UIImage + animatedGIF.m

Utilisez ce code

 NSURL *urlZif = [[NSBundle mainBundle] URLForResource:@"dots64" withExtension:@"gif"];
 NSString *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

12
Mohit

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

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

Si vous le souhaitez, au lieu de vous connecter à une URL nécessitant Internet, vous pouvez importer un fichier HTML dans votre projet Xcode et définir la racine dans la chaîne.

5
trevorgrayson

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

Voici un exemple:

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

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

- Sal

3
ObjSal

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. Je pense donc que vous pouvez l’utiliser directement dans votre Storyboard. 

À votre santé

3
akdeveloper

Si vous devez charger l'image gif à partir de l'URL, vous pouvez toujours l'intégrer dans une balise d'image dans une variable UIWebView.

2
jd.

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: String) -> [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..<count {
            if let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) {
                let image = UIImage(cgImage: cgImage)
                images.append(image)
            }
        }

        return images
    }
}

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

Swift 3:

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

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

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];
0
atul awasthi