2012-06-10 46 views
44

Necesito cargar una imagen desde una url y configurarla dentro de un UIImageView; el problema es que no sé el tamaño exacto de la imagen, entonces ¿cómo puedo mostrar la imagen correctamente?iOS: cargar una imagen desde la url

+2

Por qué ¿Sería eso un problema? Una vez que la imagen se descargue, sabrá su tamaño. También puede hacer que la imagen vea el tamaño que desea y estirar la imagen para que encaje. –

Respuesta

109

Sólo tiene que utilizar la propiedad tamaño del UIImage, por ejemplo:

NSURL *url = [NSURL URLWithString:path]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img = [[UIImage alloc] initWithData:data]; 
CGSize size = img.size; 
+0

O configure el tamaño que desea en la vista de imagen y simplemente estire la imagen una vez que se haya descargado para adaptarse a la vista de la imagen. (Debes estirar Y mantener el aspecto, todo lo demás se ve raro) –

+0

ah bien ... pero no entiendo cómo cambiar el tamaño de esta imagen para mi imageView; Tengo que crear una miniatura y no tengo mucho espacio para mi imageView (máximo 236 de ancho y máximo de 60 de alto); en este espacio debería cargar image de url pero debería ser proporcional ... – CrazyDev

+2

Creo que lo que quieres es configurar el contentMode del UIImageView en UIContentViewScaleAspectFit. Pero eche un vistazo a la documentación. – fbernardo

13

en Swift:

var url = NSURL.URLWithString("http://www.example.com/picture.png") 
var data = NSData(contentsOfURL : url) 
var image = UIImage(data : data) 
image.size // if you need it 
9

en Swift respecto utilizando opcionales:

var url:NSURL? = NSURL(string: imageString) 
var data:NSData? = NSData(contentsOfURL : url!) 
var image = UIImage(data : data!) 
+1

Esto se bloqueará si el archivo de imagen no está en la cadena de imagen especificada. – Suragch

+0

¡Haz uso de las declaraciones if lets! Este es un código inseguro y se bloqueará si url es nulo –

3

en Swift 3.0

El hilo principal debe permanecer siempre libre para que sirva a la interfaz de usuario y las interacciones del usuario.

class ViewController: UIViewController { 

@IBOutlet weak var imageView: UIImageView! 

private func fetchImage() { 
    let imageURL = URL(string: "https://i.stack.imgur.com/9z6nS.png") 
    var image: UIImage? 
    if let url = imageURL { 
     //All network operations has to run on different thread(not on main thread). 
     DispatchQueue.global(qos: .userInitiated).async { 
      let imageData = NSData(contentsOf: url) 
      //All UI operations has to run on main thread. 
      DispatchQueue.main.async { 
       if imageData != nil { 
        image = UIImage(data: imageData as! Data) 
        self.imageView.image = image 
        self.imageView.sizeToFit() 
       } else { 
        image = nil 
       } 
      } 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    fetchImage() 
} 

} 
0

para descargar la imagen asíncrono con la biblioteca de Kingfisher puede seguir este paso, url: https://github.com/onevcat/Kingfisher:

func imageFromUrl(_ urlString: String) { 
     if let url = URL(string: urlString) { 
      ImageDownloader.default.downloadImage(with: url, options: [], progressBlock: nil) { 
       (image, error, url, data) in 
       DispatchQueue.main.async { 
        self.imageView.image = image 
       } 
      } 
     } 
    } 

También puede descargar la imagen por defecto con URLSession.shared.dataTask

func imageFromUrl(_ urlString: String) { 
     if let url = URL(string: urlString) { 
      let request = URLRequest(url: url) 
      URLSession.shared.dataTask(with: request) {(data,response,error) in 
       if let imageData = data as Data? { 
        if let img = UIImage(data: imageData){ 
         DispatchQueue.main.async { 
         self.imageView.image = img 
         } 
        } 
       } 
      } 
     } 
    } 
Cuestiones relacionadas