gpt4 book ai didi

swift - 使用自动布局在 UITableview 中异步调整 UIImage 高度

转载 作者:行者123 更新时间:2023-11-30 11:36:36 27 4
gpt4 key购买 nike

我在 UITableView 中显示图像,该图像将具有不同的大小,并且通过 JSON 下载,使用以下代码,图像显示正确缩放,但上下有一些大的空间(绿色)。我怎样才能消除这些空格?

图像的上、下、左、右约束为 0,以便能够使用自动布局

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

struct JsonSosTalleres : Codable {
let titulo : String
let image : String
}

private var datosOfertas = [JsonSosTalleres]()

class ImageLoader {

var cache = NSCache<AnyObject, AnyObject>()

class var sharedInstance : ImageLoader {
struct Static {
static let instance : ImageLoader = ImageLoader()
}
return Static.instance
}

func imageForUrl(urlString: String, completionHandler:@escaping (_ image: UIImage?, _ url: String) -> ()) {
let data: NSData? = self.cache.object(forKey: urlString as AnyObject) as? NSData

if let imageData = data {
let image = UIImage(data: imageData as Data)
DispatchQueue.main.async {
completionHandler(image, urlString)
}
return
}

let downloadTask: URLSessionDataTask = URLSession.shared.dataTask(with: URL.init(string: urlString)!) { (data, response, error) in
if error == nil {
if data != nil {
let image = UIImage.init(data: data!)
self.cache.setObject(data! as AnyObject, forKey: urlString as AnyObject)
DispatchQueue.main.async {
completionHandler(image, urlString)
}
}
} else {
completionHandler(nil, urlString)
}
}
downloadTask.resume()
}
}



@IBOutlet weak var tabla: UITableView!
override func viewDidLoad() {
super.viewDidLoad()

downloadJson()


tabla.estimatedRowHeight = 40.0

tabla.rowHeight = UITableViewAutomaticDimension

tabla.tableFooterView = UIView()

}








func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datosOfertas.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tabla.dequeueReusableCell(withIdentifier: "ofertacell") as? TableViewCell else { return UITableViewCell() }


let fimage = datosOfertas[indexPath.row].image
ImageLoader.sharedInstance.imageForUrl(urlString: fimage, completionHandler: { (image, url) in
if image != nil {


tableView.beginUpdates()

cell.imagen.image = image

tableView.endUpdates()


}
})



return cell
}




// download json
let url = URL(string: "http://sostalleres.com/test.json")

func downloadJson() {
guard let downloadURL = url else { return }
URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
guard let data = data, error == nil, urlResponse != nil else {
print("something is wrong")
return
}
print("downloaded")
do
{
let decoder = JSONDecoder()
self.datosOfertas = [try decoder.decode(JsonSosTalleres.self, from: data)]

DispatchQueue.main.async {

self.tabla.reloadData()

}

} catch {
print("something wrong after downloaded")
}
}.resume()
}





}

在 TableViewCell.swift 中:

class TableViewCell: UITableViewCell {

@IBOutlet weak var imagen: UIImageView!



override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}

}

View image

如果您能指导我解决任何问题,我将不胜感激。

最佳答案

您必须计算新的高度和宽度,并使用它们应用比例并使用tableView.beginUpdates()tableView.endUpdates(),代码如下你应该可以毫无问题地工作。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tabla.dequeueReusableCell(withIdentifier: "ofertacell") as? TableViewCell else { return UITableViewCell() }


let fimage = datosOfertas[indexPath.row].image
ImageLoader.sharedInstance.imageForUrl(urlString: encoded!, completionHandler: { (image, url) in
if image != nil {


let newWidth = self.self.imagenDetalle.frame.width
let scale = newWidth/(image?.size.width)!
let newHeight = (image?.size.height)! * scale



tableView.beginUpdates()

UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight))
image?.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
cell.imagen.image = newImage

tableView.endUpdates()


}
})



return cell
}

祝你编码愉快!

关于swift - 使用自动布局在 UITableview 中异步调整 UIImage 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49698890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com