在表视图中调整行大小的最佳方法是什么?

时间:2018-01-15 04:57:30

标签: ios swift uitableview

在表格视图中尽可能平滑地调整行大小的最佳方法是什么,以便单元格中包含的图像在占据整个单元格时保留其纵横比? 注意:这些图像是以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
}

}

1 个答案:

答案 0 :(得分:0)

您应该按照以下步骤操作:

  1. 为tableview设置UITableViewAutomaticDimension
  2. 将图像视图的自动布局约束设置为单元格的顶部和底部,以便单元格自动将其高度调整为图像视图的高度。

  3. 由于您下载了图像,因此您应该在完成图像下载后重新加载重新加载单元(如果您可以共享用于下载图像的代码,我将能够解释更多信息)。