2012-06-10 115 views
44

我需要从url加载图片并将其设置在UIImageView中;问题是我不知道图像的确切大小,那我该如何正确显示图像?iOS:从url加载图片

+2

为什么那会是一个问题吗?一旦图像下载,你就会知道它的大小。您还可以使图像显示您想要的尺寸,并将图像拉伸以适合。 –

回答

109

只需使用的UIImage的大小属性,例如:

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

或者在图像视图中设置所需的大小,并在图像下载后适当拉伸图像以适合图像视图。 (你应该拉伸和保持方面,一切看起来很奇怪) –

+0

啊好吧...但我不明白如何调整我的imageView这个图像的大小;我sholud创建一个缩影,我没有很多空间为我的imageView(最大236宽度和最大高度60);在这个空间,我应该从url加载图像,但它应该成比例... – CrazyDev

+2

我想你想要的是将UIImageView的contentMode设置为UIContentViewScaleAspectFit。但看看文档。 – fbernardo

13

在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

在迅速关于使用选配:

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

如果图像文件不在指定的图像字符串,这将崩溃。 – Suragch

+0

利用if让我们声明!这是不安全的代码,如果url为零,将会崩溃 –

3

斯威夫特3.0

主线程必须始终保持空闲状态,以便为用户界面和用户交互提供服务。

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

下载与翠鸟库异步图片你可以按照这个步骤,网址: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 
       } 
      } 
     } 
    } 

您还可以下载图片的默认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 
         } 
        } 
       } 
      } 
     } 
    }