2012-06-10 6 views
44

Potrzebuję załadować obraz z adresu URL i ustawić go w UIImageView; Problem polega na tym, że nie znam dokładnego rozmiaru obrazu, a następnie w jaki sposób mogę poprawnie wyświetlić obraz?iOS: załaduj obraz z adresu URL

+2

Dlaczego Czy to byłby problem? Po pobraniu obrazu poznasz jego rozmiar. Możesz również sprawić, aby obraz miał pożądany rozmiar i rozciągnąć obraz tak, aby pasował. –

Odpowiedz

109

Wystarczy użyć właściwości rozmiaru UIImage, na przykład:

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

Lub ustaw żądany rozmiar w widoku obrazu i po prostu rozciągnij obraz po pobraniu, aby dopasować go do widoku obrazu. (Powinieneś rozciągnąć I zachować aspekt, wszystko inne wygląda dziwnie) –

+0

ah ok ... ale nie rozumiem, jak zmienić rozmiar tego obrazu dla mojego imageView; Ja sholud stworzyć miniaturę i nie mam dużo miejsca na mój imageView (max 236 szerokość i max 60 na wysokość); w tym miejscu powinienem załadować obraz z adresu URL, ale powinien on być proporcjonalny ... – CrazyDev

+2

Myślę, że chcesz ustawić contentMode UIImageView na UIContentViewScaleAspectFit. Ale spójrz na dokumentację. – fbernardo

13

w 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

w Swift dotyczące korzystających optionals:

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

Spowoduje to awarię, jeśli plik obrazu nie znajduje się w określonym ciągu obrazu. – Suragch

+0

Skorzystaj z instrukcji if lets! Jest to niebezpieczny kod i ulegnie awarii, jeśli adres URL jest zerowy –

3

w Swift 3.0

Główny wątek musi być zawsze wolny, aby obsługiwać interfejs użytkownika i interakcje użytkownika.

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

Aby pobrać Asynchronous obraz z biblioteki Kingfisher można wykonać ten krok 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 
       } 
      } 
     } 
    } 

Można również pobrać obraz z domyślnie 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 
         } 
        } 
       } 
      } 
     } 
    }