在表格视图中尽可能平滑地调整行大小的最佳方法是什么,以便单元格中包含的图像在占据整个单元格时保留其纵横比?
注意:这些图像是以cellForRowAt
方法下载的,因此在应用程序运行时期之前,它们的大小才会知道。
更新: 这是配置TableViewCell
的代码import UIKit
class TableViewCell: UITableViewCell {
@IBOutlet weak var cellImageView: UIImageView!
var aspectConstraint: NSLayoutConstraint?
override func prepareForReuse() {
super.prepareForReuse()
aspectConstraint = nil
}
func setCellImage(image:UIImage){
let aspect = image.size.width / image.size.height
aspectConstraint = cellImageView.heightAnchor.constraint(equalTo: cellImageView.widthAnchor, multiplier: aspect)
cellImageView.image = image
}
}
这是tableViewController的代码
import UIKit
import Firebase
import FirebaseStorageUI
class TableViewController: UITableViewController {
var imageURLS:[String] = [String]()
var listener:ListenerRegistration?
override func viewDidLoad() {
super.viewDidLoad()
listener = Firestore.firestore().collection("Posts").addSnapshotListener{
querySnapshot, error in
guard let snapshot = querySnapshot else {
print("Error fetching snapshots: \(error!)")
return
}
snapshot.documentChanges.forEach { diff in
if (diff.type == .added) {
print("New data: \(diff.document.data())")
}
if (diff.type == .modified) {
print("Modified data: \(diff.document.data())")
}
if (diff.type == .removed) {
print("Removed data: \(diff.document.data())")
}
guard let newImageURL = diff.document.data()["imageDownloadURL"] as? String else{
print("Failed to get image download URL")
return
}
print("downloadURL: \(newImageURL)")
self.imageURLS.insert(newImageURL, at: 0)
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.insertRows(at: [indexPath], with: .top)
}
}
tableView.estimatedRowHeight = 100.0
tableView.rowHeight = UITableViewAutomaticDimension
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return imageURLS.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Reuse", for: indexPath) as! TableViewCell
let downloadURL = URL(string: self.imageURLS[indexPath.row])
if cell.cellImageView.image == nil{
URLSession.shared.dataTask(with: downloadURL!) { (data, _, _) in
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.setCellImage(image:image!)
tableView.reloadRows(at: [indexPath], with: .top)
}
}
}.resume()
}
return cell
}
}
答案 0 :(得分:0)
您应该按照以下步骤操作:
将图像视图的自动布局约束设置为单元格的顶部和底部,以便单元格自动将其高度调整为图像视图的高度。
由于您下载了图像,因此您应该在完成图像下载后重新加载重新加载单元(如果您可以共享用于下载图像的代码,我将能够解释更多信息)。