Ich möchte eine dynamische Zelle in meinem UITableView
im Falle der Bildhöhe machen. Alles funktioniert ordnungsgemäß, aber wenn ich meine UITableView
blättern, schreit Debugger mich über schlechte Einschränkungen in meiner Zelle, aber Zellen sehen genau aus, was ich will. Ich kann nicht ruhig sein, wenn ich diese Debug-Informationen sehen;)Updating Constraints in UITableViewCell sind nicht richtig
Meine CustomCell
Klasse sieht wie folgt aus:
class CustomCell: UITableViewCell {
//MARK: - Outlets
@IBOutlet weak var photoImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var heightConstraint: NSLayoutConstraint!
//MARK: - Variables
var dream: MyDream? {
didSet {
if let item = dream, let image = UIImage(data: item.photoData) {
scaleImageView(image: image)
photoImageView.image = image
titleLabel.text = item.title
}
}
}
func scaleImageView(image: UIImage) {
let imageWidth = image.size.width
let imageScale = image.size.height/image.size.width
if imageWidth > photoImageView.bounds.width {
heightConstraint.constant = photoImageView.bounds.size.width * imageScale
} else {
heightConstraint.constant = imageWidth * imageScale
}
}
}
meiner Zelle in .xib
sieht wie folgt aus:
TitleLabel
doesn't have a height constraint. Leading, Top, Trailing, Bottom only.
und meine ViewController
ist ziemlich einfach und sieht so aus:
class ViewController: UIViewController {
//MARK: - Outlets
@IBOutlet var tableView: UITableView!
//MARK: - Variables
lazy var dreams = [MyDream]()
override func viewDidLoad() {
super.viewDidLoad()
createModel() // I mock data here :)
setTableView()
}
func setTableView() {
tableView.delegate = self
tableView.dataSource = self
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
tableView.register(UINib(nibName: String(describing: CustomCell.self), bundle: nil), forCellReuseIdentifier: "cell")
}
func createModel() {
for i in 0..<12 {
if i < 6 {
if let image = UIImage(named: "\(i + 1)"), let imageData = UIImageJPEGRepresentation(image, 100) {
let dream = MyDream(photoData: imageData, title: "Image number \(i + 1)")
dreams.append(dream)
}
} else {
if let image = UIImage(named: "\(i - 5)"), let imageData = UIImageJPEGRepresentation(image, 100) {
let dream = MyDream(photoData: imageData, title: "Image number \(i + 1)")
dreams.append(dream)
}
}
}
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dreams.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
cell.dream = dreams[indexPath.row]
cell.selectionStyle = .none
return cell
}
}
Wie sieht es aus wie in Simulator:
alles gut aussehen, aber Konsole gibt mir diese Art von Fehler:
Ich weiß nicht, warum ? Ich habe versucht, layoutIfNeeded()
, updateConstraints()
und in didSet
in CustomCell
zu verwenden, ist aber nicht hilfreich. Irgendwelche Vorschläge?
Haben Sie eine geschätzte Höhe für Zeilen in Ihrer Tabellenansicht festgelegt oder die Funktion 'geschätzteHeightForRow (at:)' implementiert? – Paulw11
Er hat 'geschätztRowHeight' gesetzt und' rowHeight' von 'UITableViewAutomaticDimension' verwendet, was alles Nötige ist. Diese Art von Warnung bezüglich der "Encapsulated Layout Height" kann gelöst werden, indem eine vertikale Beschränkung von 1000 auf 999 verringert wird, was den Fehler verhindert, aber die Höhe wird dann korrekt berechnet. Z.B. https://stackoverflow.com/q/25059443/1271826. Suchen Sie SO nach 'UIView-Encapsulated-Layout-Height' und Sie werden viele Diskussionen zu diesem Thema sehen. – Rob