Tôi cần tải hình ảnh từ url và đặt hình ảnh đó trong UIImageView; vấn đề là tôi không biết kích thước chính xác của hình ảnh, sau đó làm thế nào tôi có thể hiển thị hình ảnh chính xác?iOS: tải hình ảnh từ url
Trả lời
Chỉ cần sử dụng tài sản của UIImage kích thước, ví dụ:
NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
CGSize size = img.size;
Hoặc đặt kích thước bạn muốn trên chế độ xem hình ảnh và chỉ kéo giãn hình ảnh sau khi được tải xuống để vừa với chế độ xem hình ảnh. (Bạn nên kéo dài và giữ cho khía cạnh, mọi thứ khác trông lạ) –
ah ok ... nhưng tôi không hiểu cách thay đổi kích thước hình ảnh này cho imageView của tôi; Tôi sholud để tạo ra một thu nhỏ và tôi đã không có rất nhiều không gian cho imageView của tôi (tối đa 236 chiều rộng và tối đa 60 cho chiều cao); trong không gian này tôi nên tải hình ảnh từ url nhưng nó phải được cân đối ... – CrazyDev
Tôi nghĩ rằng những gì bạn muốn là đặt contentMode của UIImageView thành UIContentViewScaleAspectFit. Nhưng hãy xem tài liệu. – fbernardo
Trong nhanh chóng:
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
Trong nhanh chóng liên quan đến sử dụng optionals:
var url:NSURL? = NSURL(string: imageString)
var data:NSData? = NSData(contentsOfURL : url!)
var image = UIImage(data : data!)
Điều này sẽ sụp đổ nếu tệp hình ảnh không phải là chuỗi hình ảnh được chỉ định. – Suragch
Sử dụng các câu lệnh if! Đây là mã không an toàn và sẽ bị lỗi nếu url là số không –
TRÊN SWIFT 3.0
Chủ đề chính phải luôn được duy trì miễn phí để nó phục vụ giao diện người dùng và tương tác của người dùng.
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()
}
}
Để tải hình ảnh không đồng bộ với thư viện Kingfisher bạn có thể làm theo bước này, 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
}
}
}
}
Bạn cũng có thể tải hình ảnh với mặc định 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
}
}
}
}
}
}
Tại sao đó có phải là một vấn đề? Khi hình ảnh được tải xuống, bạn sẽ biết kích thước của nó. Bạn cũng có thể làm cho hình ảnh xem kích thước bạn muốn và kéo giãn hình ảnh cho vừa. –