2016-10-11 2 views
0

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)> 
+0

Haben Sie 'tableView setNeedsLayout]' und '[tableView layoutConstraints]' im Abschlussblock Ihrer asynchronen Operationen ausprobiert? – brandonscript

+0

Ja, ich habe immer noch die Warnungen. Siehe unten Antwort. – JimmyJammed

Antwort

0

Sie

tableview.estimatedRowHeight = tableview.rowHeight 
tableview.rowHeight = UITableView.AutomaticDimension() 

Danach setzen müssen, ist alles über Einschränkungen

+0

.. zum Beispiel, wenn Sie ein Bild haben, setzen Sie SizeToFit und Margin Constraints –

+0

Entschuldigung, ich habe tatsächlich bereits die Tabelle View rowHeight und throughoutRowHeight richtig eingestellt. Das Problem ist mehr, dass die Tabelle die Zellen lädt, die Zellen mit einer Höhe beginnen (sagen wir nur 100), dann beendet die Async-Operation die Größe der Zelle aus ihrer eigenen Klasse und ändert sie in eine größere Höhe (variiert), dann erzeugt die TabelleView eine Warnung aufgrund von Einschränkungsfehlern. – JimmyJammed

0

Es stellt sich heraus, dass es einen Fehler gibt, wenn es darum geht, UIButton innerhalb einer UITableViewCell zu verwenden.

Ändern der Priorität der Beschränkung auf den vertikalen Abstand der UIButton behebt den Fehler:

War

[NSLayoutConstraint activateConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @ "V: | [label (32)] - [ imageView (100)] - 16- [Taste (buttonHeight)] -8- | " Optionen: NSLayoutFormatAlignAllCenterX Metriken: Metriken Ansichten: Ansichten]];

Jetzt:

[NSLayoutConstraint activateConstraints: [NSLayoutConstraint constraintsWithVisualFormat: @ "V: | [label (32)] - [Imageview (100)] - 16- [Taste (Button)] -8 @ 999- | " Optionen: NSLayoutFormatAlignAllCenterX Metriken: Metriken Ansichten: Ansichten]];

Verwandte Themen