Ich habe eine UITableViewController
, die eine Vielzahl von benutzerdefinierten UITableViewCell
Unterklassen anzeigen. Einige dieser Klassen haben dynamischen Inhalt, der die Größe der Zelle ändern kann.iOS - Autolayout Constraint Fehler für dynamische UITableViewCell Klasse
Ein Teil dieses dynamischen Inhalts wird über asynchronous operations
generiert, z. B. Bilder, Daten usw. herunterladen. Die Ergebnisse werden dann verwendet, um die richtige Größe für die Zelle zu bestimmen.
Ich bekomme viele Constraint-Warnungen, wenn die Zelle ihr Layout aktualisiert. Es scheint, einige der UITableView
Einschränkungen zu brechen (d. H. Die Höhe der Zelle war 100, bevor die Daten fertig heruntergeladen wurden, wurde dann auf 250 aktualisiert).
Die einzige Möglichkeit, diese Warnungen zu beheben, war eine delegate
Methode zu der Klasse der Zelle hinzufügen, die in UITableViewController
ausgelöst wird und [tableView reloadData]
aufrufen;
Diese Problematik ist aber, wie es Retriggern einige der Zelle der asynchronen Operation endet usw.
Meine Frage ist, was ist der beste Ansatz, wenn Sie benutzerdefinierte UITableViewCell
Klasse, die dynamischen Inhalte, die ändert die Größe der Zelle, nachdem die Tabelle anfänglich lädt und die Zelle anzeigt?
Messküvette Layout:
UILabel
UIImage
UICollectionView Dies wird nur dann, wenn Objekte gezeigt für den aktuellen Benutzer zu finden sind. Es kann zwischen 1-3 Zeilen der Objektdaten anzeigen (wodurch die Höhe der Zelle geändert wird) oder wird ausgeblendet, wenn kein Objekt für den Benutzer gefunden wird.
UIButton
Hier ist ein Beispiel Warnung:
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x17469f2c0 V:|-(5)-[UIView:0x109431f90] (active, names: '|':UITableViewCellContentView:0x10943fcd0)>",
"<NSLayoutConstraint:0x17469f590 V:[UIView:0x109431f90]-(5)-| (active, names: '|':UITableViewCellContentView:0x10943fcd0)>",
"<NSLayoutConstraint:0x174699a00 V:|-(0)-[UILabel:0x102d0b8f0'Welcome!'] (active, names: '|':UIView:0x109431f90)>",
"<NSLayoutConstraint:0x174699e10 UILabel:0x102d0b8f0'Welcome!'.height == 32 (active)>",
"<NSLayoutConstraint:0x17469fcc0 V:[UILabel:0x102d0b8f0'Welcome!']-(0)-[UIView:0x102d019c0] (active)>",
"<NSLayoutConstraint:0x17469f770 UIView:0x102d019c0.height == 1 (active)>",
"<NSLayoutConstraint:0x17469f9a0 V:[UIView:0x102d019c0]-(0)-[UIImageView:0x102da1cb0] (active)>",
"<NSLayoutConstraint:0x17469fb30 UIImageView:0x102da1cb0.height == 161 (active)>",
"<NSLayoutConstraint:0x17469f810 V:[UIImageView:0x102da1cb0]-(16)-[UILabel:0x102d14150'Optional Message'] (active)>",
"<NSLayoutConstraint:0x174690ef0 V:[UILabel:0x102d14150'Message']-(16)-[UICollectionView:0x103a01a00] (active)>",
"<NSLayoutConstraint:0x174880230 V:[UICollectionView:0x103a01a00]-(16)-[UIButton:0x102d7e6a0] (active)>",
"<NSLayoutConstraint:0x1748801e0 UIButton:0x102d7e6a0.height == 36 (active)>",
"<NSLayoutConstraint:0x174883890 V:[UIButton:0x102d7e6a0]-(24)-| (active, names: '|':UIView:0x109431f90)>",
"<NSLayoutConstraint:0x174882850 UICollectionView:0x103a01a00.height == 220 (active)>",
"<NSLayoutConstraint:0x174882e40 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x10943fcd0.height == 329 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x174882850 UICollectionView:0x103a01a00.height == 220 (active)>
Haben Sie 'tableView setNeedsLayout]' und '[tableView layoutConstraints]' im Abschlussblock Ihrer asynchronen Operationen ausprobiert? – brandonscript
Ja, ich habe immer noch die Warnungen. Siehe unten Antwort. – JimmyJammed