objective c - Añadir imagen Gif animada en Iphone UIImageView
objective-c (12)
Necesito cargar una imagen animada de Gif desde una URL en UIImageview.
Cuando usé el código normal, la imagen no se cargó.
¿Hay alguna otra forma de cargar imágenes animadas de Gif?
Aquí está la mejor solución para usar Gif Image. Agrega SDWebImage desde Github en tu proyecto.
#import "UIImage+GIF.h"
_imageViewAnimatedGif.image= [UIImage sd_animatedGIFNamed:@"thumbnail"];
Aquí hay una biblioteca interesante: https://github.com/Flipboard/FLAnimatedImage
Probé el ejemplo de demostración y está funcionando muy bien. Es un hijo de UIImageView. Así que creo que también puedes usarlo en tu Storyboard directamente.
Aclamaciones
Esto ha encontrado una respuesta aceptada, pero recientemente me encontré con la extensión github.com/mayoff/uiimage-from-animated-gif UIImage. Proporciona la siguiente categoría:
+[UIImage animatedImageWithAnimatedGIFURL:(NSURL *)url]
lo que le permite simplemente:
#import "UIImage+animatedGIF.h"
UIImage* mygif = [UIImage animatedImageWithAnimatedGIFURL:[NSURL URLWithString:@"http://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif"]];
Funciona como magia
Esto no cumple con el requisito de usar UIImageView, pero quizás esto simplifique las cosas para usted. ¿Has considerado usar UIWebView?
NSString *gifUrl = @"http://gifs.com";
NSURL *url = [NSURL URLWithString: gifUrl];
[webView loadRequest: [NSURLRequest requestWithURL:url]
Si lo desea, en lugar de enlazar a una URL que requiere Internet, podría importar un archivo HTML en su proyecto Xcode y establecer la raíz en la cadena.
Puede 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];
Sé que ya se aprobó una respuesta, pero es difícil no tratar de compartir. He creado un marco incrustado que agrega soporte de Gif a iOS que se siente como si estuvieras usando cualquier otra clase de UIKit Framework.
Aquí hay un ejemplo:
UIGifImage *gif = [[UIGifImage alloc] initWithData:imageData];
anUiImageView.image = gif;
Descargue la última versión de https://github.com/ObjSal/UIGifImage/releases
- Sal
Si conoce la duración del archivo gif, no necesita una biblioteca de terceros.
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
}
}
Para usar esta extensión,
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()
}
Si debe cargar la imagen gif desde la URL, siempre puede insertar el gif en una etiqueta de imagen en un UIWebView
.
Swift 3:
Como se sugirió anteriormente, estoy usando FLAnimatedImage con un FLAnimatedImageView. Y estoy cargando el gif como un conjunto de datos de xcassets. Esto me permite proporcionar diferentes gifs para iphone y ipad para fines de apariencia y corte de aplicaciones. Esto es mucho más eficiente que cualquier otra cosa que haya intentado. También es fácil pausar usando .stopAnimating ().
if let asset = NSDataAsset(name: "animation") {
let gifData = asset.data
let gif = FLAnimatedImage(animatedGIFData: gifData)
imageView.animatedImage = gif
}
Ver este enlace
e importa estas clases UIImage + animatedGIF.h, UIImage + animatedGIF.m
Usa 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 esto sea útil
SWIFT 3
¡Aquí está la actualización para aquellos que necesitan la versión Swift !.
Hace unos días tuve que hacer algo como esto. Cargué algunos datos de un servidor según los parámetros específicos y, mientras tanto, quería mostrar una imagen gif diferente de "cargando". Estaba buscando una opción para hacerlo con un UIImageView
pero desafortunadamente no encontré algo para hacerlo sin dividir las imágenes .gif. Así que decidí implementar una solución usando UIWebView
y quiero compartirla:
extension UIView{
func animateWithGIF(name: String){
let htmlString: String = "<!DOCTYPE html><html><head><title></title></head>" +
"<body style=/"background-color: transparent;/">" +
"<img src=/""+name+"/" align=/"middle/" style=/"width:100%;height:100%;/">" +
"</body>" +
"</html>"
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)
}
}
Hice una extensión para UIView
que agrega un UIWebView
como subvista y muestra las imágenes .gif solo pasando su nombre.
Ahora en mi UIViewController
tengo una UIView
llamada ''loadingView'' que es mi indicador de ''carga'' y cada vez que quería mostrar la imagen .gif, hice algo como esto:
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
}
}
cuando quise cambiar la imagen gif, simplemente llamé a la función configureLoadingView()
con el nombre de mi nueva imagen .gif y showLoadingView()
a showLoadingView()
, hideLoadingView()
correctamente ¡todo funciona bien !.
PERO...
... si tiene la imagen dividida, entonces puede animarla en una sola línea con un método estático de UIImage
llamado UIImage.animatedImageNamed
como este:
imageView.image = UIImage.animatedImageNamed("imageName", duration: 1.0)
De los documentos:
Este método carga una serie de archivos al agregar una serie de números al nombre del archivo base provisto en el parámetro de nombre. Todas las imágenes incluidas en la imagen animada deben compartir el mismo tamaño y escala.
O puede hacerlo con el 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)
De los documentos:
Crea y devuelve una imagen animada de un conjunto existente de imágenes. Todas las imágenes incluidas en la imagen animada deben compartir el mismo tamaño y escala.
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];
Puede cargar más de una imagen gif.
Puedes dividir tu gif usando el siguiente comando ImageMagick :
convert +adjoin loading.gif out%d.gif