Adicionar imagem gif animada no Iphone UIImageView

Eu preciso carregar uma imagem gif animada de um URL no UIImageview.

Quando usei o código normal, a imagem não foi carregada.

Existe alguma outra maneira de carregar imagens GIF animadas?

    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]; 

    Você pode carregar mais de uma imagem gif.

    Você pode dividir seu gif usando o seguinte comando ImageMagick :

     convert +adjoin loading.gif out%d.gif 

    Isso encontrou uma resposta aceita, mas recentemente encontrei a extensão UIImage + animatedGIF UIImage. Ele fornece a seguinte categoria:

     +[UIImage animatedImageWithAnimatedGIFURL:(NSURL *)url] 

    permitindo que você simplesmente:

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

    Funciona como mágica.

    Aqui está a melhor solução para usar a imagem GIF. Adicione o SDWebImage do Github em seu projeto.

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

    Verifique este link

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

    e importar essas clas UIImage + animatedGIF.h, UIImage + animatedGIF.m

    Use este código

      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]; 

    Espero que isso seja útil

    Isso não atende ao requisito de usar um UIImageView, mas talvez isso simplifique as coisas para você. Você já pensou em usar um UIWebView?

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

    Se você quiser, em vez de vincular a uma URL que requer Internet, você pode importar um arquivo HTML para seu projeto Xcode e definir a raiz na string.

    Aqui está uma biblioteca interessante: https://github.com/Flipboard/FLAnimatedImage

    Eu testei o exemplo de demonstração e está funcionando muito bem. É um filho do UIImageView. Então eu acho que você pode usá-lo em seu Storyboard diretamente também.

    Felicidades

    Eu sei que uma resposta já foi aprovada, mas é difícil não tentar compartilhar que eu criei uma estrutura incorporada que adiciona suporte a Gif para iOS que se sente como se você estivesse usando qualquer outra class UIKit Framework.

    Aqui está um exemplo:

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

    Faça o download da versão mais recente em https://github.com/ObjSal/UIGifImage/releases

    – Sal

    Se você precisar carregar a imagem gif a partir do URL, poderá sempre incorporar o gif em uma tag de imagem em um UIWebView .

    Você pode usar 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:

    Como sugerido acima, estou usando o FLAnimatedImage com um FLAnimatedImageView. E estou carregando o gif como um dataset de xcassets. Isso me permite fornecer diferentes gifs para iphone e ipad para fins de aparência e fatiamento de aplicativos. Isto é muito mais eficaz do que qualquer outra coisa que eu tentei. Também é fácil pausar usando .stopAnimating ().

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

    SWIFT 3

    Aqui está a atualização para quem precisa da versão Swift !.

    Alguns dias atrás eu precisava fazer algo assim. Eu carrego alguns dados de um servidor de acordo com parâmetros específicos e, entretanto, eu queria mostrar uma imagem diferente do gif de “carregamento”. Eu estava procurando uma opção para fazê-lo com um UIImageView mas infelizmente não encontrei algo para fazer isso sem dividir as imagens .gif. Então eu decidi implementar uma solução usando um UIWebView e quero compartilhá-lo:

     extension UIView{ func animateWithGIF(name: String){ let htmlString: String = "" + "" + "" + "" + "" let path: NSString = Bundle.main.bundlePath as NSString let baseURL: URL = URL(fileURLWithPath: path as String) // 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.loadHTMLString(htmlString, 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) } } 

    Eu fiz uma extensão para o UIView que adiciona um UIWebView como subview e exibe as imagens .gif apenas passando seu nome.

    Agora no meu UIViewController eu tenho um UIView chamado 'loadingView', que é o meu indicador 'loading' e sempre que eu queria mostrar a imagem .gif, eu fiz algo assim:

     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: String){ loadingView.animateWithGIF(name: "name")// change the image } } 

    quando eu quis mudar a imagem gif, simplesmente chamei a function configureLoadingView() com o nome da minha nova imagem .gif e chamando showLoadingView() , hideLoadingView() corretamente tudo funciona bem !.

    MAS...

    ... se você tem a imagem dividida, então você pode animar em uma única linha com um método estático UIImage chamado UIImage.animatedImageNamed assim:

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

    Dos docs:

    Esse método carrega uma série de arquivos anexando uma série de números ao nome do arquivo base fornecido no parâmetro name. Todas as imagens incluídas na imagem animada devem compartilhar o mesmo tamanho e escala.

    Ou você pode fazê-lo com o método UIImage.animatedImageWithImages como este:

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

    Dos docs:

    Cria e retorna uma imagem animada de um conjunto existente de imagens. Todas as imagens incluídas na imagem animada devem compartilhar o mesmo tamanho e escala.

    Se você sabe a duração do arquivo gif, você não precisa de uma biblioteca de terceiros.

     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.. 

    Para usar essa extensão,

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