2017-08-15 4 views
0

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:

enter image description here

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:

enter image description here

alles gut aussehen, aber Konsole gibt mir diese Art von Fehler:

enter image description here

Ich weiß nicht, warum ? Ich habe versucht, layoutIfNeeded(), updateConstraints() und in didSet in CustomCell zu verwenden, ist aber nicht hilfreich. Irgendwelche Vorschläge?

+0

Haben Sie eine geschätzte Höhe für Zeilen in Ihrer Tabellenansicht festgelegt oder die Funktion 'geschätzteHeightForRow (at:)' implementiert? – Paulw11

+0

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

Antwort

0

Ich vermute, Sie haben einige redundante Einschränkungen für Ihr Bild. Sie könnten Höhe/unten/oben Einschränkungen sein. Man sollte entfernt werden

+0

Nein, die Tatsache, dass der Fehler mit "UIView-Encapsulated-Layout-Height" verbunden ist, legt nahe, dass dies nicht das Problem ist. Es ist ein bekanntes, lästiges "Feature" zur dynamischen Größenanpassung von Zeilen. – Rob

Verwandte Themen