2012-06-10 9 views
44

Ho bisogno di caricare un'immagine da un URL e impostarla all'interno di UIImageView; il problema è che non conosco le dimensioni esatte dell'immagine, quindi come posso mostrare correttamente l'immagine?iOS: carica un'immagine dall'URL

+2

Perché sarebbe un problema? Una volta che l'immagine è stata scaricata, ne conoscerai le dimensioni. Puoi anche fare in modo che l'immagine visualizzi la dimensione desiderata e allungare l'immagine per adattarla. –

risposta

109

Basta utilizzare la proprietà dimensione del UIImage, ad esempio:

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

Oppure imposta la dimensione desiderata nella visualizzazione dell'immagine e allunga semplicemente l'immagine una volta scaricata per adattarla alla vista dell'immagine. (Dovresti allungare E mantenere l'aspetto, tutto il resto sembra strano) –

+0

ah ok ... ma non capisco come ridimensionare questa immagine per il mio imageView; Mi dedico a creare una miniatura e non ho molto spazio per la mia imageView (max 236 larghezza e max 60 per altezza); in questo spazio dovrei caricare l'immagine dall'URL ma dovrebbe essere proporzionata ... – CrazyDev

+2

Penso che quello che vuoi sia impostare il contentMode di UIImageView su UIContentViewScaleAspectFit. Ma dai un'occhiata alla documentazione. – fbernardo

13

a 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

a Swift per quanto riguarda utilizzando optional:

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

Questo si bloccherà se il file immagine non si trova nella stringa di immagine specificata. – Suragch

+0

Usa le dichiarazioni if! Questo è un codice non sicuro e si bloccherà se url è nullo –

3

IN SWIFT 3.0

Il thread principale deve essere sempre libero, quindi serve l'interfaccia utente e le interazioni dell'utente.

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

per scaricare l'immagine asincrono con biblioteca Kingfisher è possibile seguire questo passaggio, 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 
       } 
      } 
     } 
    } 

è anche possibile scaricare un'immagine con predefinito 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 
         } 
        } 
       } 
      } 
     } 
    }