2016-05-15 7 views
2

Ich habe meine benutzerdefinierte uitableviewcell erfolgreich mit automatischer Bemaßung arbeiten lassen. In meiner benutzerdefinierten Zelle habe ich eine Beschriftung (wird verwendet, um Beschriftungen anzuzeigen, kann eine Zeile oder Multilinien sein) und eine Bildansicht. Auto-Layout ist korrekt eingestellt und ich habe die geschätzte Zeilenhöhe angegeben und die Zeilenhöhe als automatische Dimension festgelegt. Meine benutzerdefinierte Zelle ändert die Höhe basierend auf UILabel-Text dynamisch, wenn ich Dummy-Daten verwendete, die in viewDidLoad eingerichtet wurden.UITableViewCell Automatische Zeilenhöhe funktioniert nach asynchronem Aufruf nicht

Allerdings muss ich API-Aufruf innerhalb meiner benutzerdefinierten Tableviewcell-Klasse, d. H. Innerhalb CellForRowAtIndexPath-Methode, um entsprechende Daten abrufen, um in meinem UILabel und UIImageView anzuzeigen. Nach dem erfolgreichen Abrufen der Daten aktualisiere ich die UI-Elemente. In diesem Fall ändert die Zelle die Höhe jedoch nicht dynamisch und mein UILabel wird auf eine Zeile gekürzt.

Ich habe versucht, reloadRowsAtIndexPath-Methode aufrufen, aber es verursacht seltsame Bounces, wenn ich die Tabellenansicht scrollen. Ich habe Stunden versucht, irgendeine Idee, wie man automatische Tabellenansichtreihenhöhe herstellt, wenn nach dem Abrufen von Daten vom API Anruf?

+0

Warum rufen Sie Ihre API in CellForRowAtIndexPath ?? Sie können Ihre API in viewDidLoad() aufrufen und das Ergebnis in einem Array oder einem Array von Wörterbüchern gemäß Ihren Anforderungen speichern. Sie können dieses Array dann zum Aktualisieren von UI-Elementen verwenden. – luckyShubhra

+0

Ich denke, es ist völlig normal, die API von cellForRow ... aufzurufen, weil wir keine externen Daten abrufen wollen, die der Benutzer möglicherweise nie anzeigt. – Jonny

Antwort

1

überprüfen Sie diese Dinge befolgt haben,

  1. self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 50; // Setzen Sie dies auf einen Wert, der für Sie arbeitet.

  2. festgelegte Anzahl von Zeilen des Etiketts auf 0 (sehr wichtig)

  3. entfernen, wenn eine Höhenbeschränkung auf das Etikett angegebene

  4. auf cellForRow während einer Zelle zurückkehren, versuchen Sie diesen

    zu tun

    cell.contentView.setNeedsLayout() cell.contentView.layoutIfNeeded()

Das ist es, es wird die Größe des Etiketts entsprechend der Zeichenfolge ändern, die Sie angegeben haben. Für weitere Informationen folgen Sie dieser https://www.sitepoint.com/self-sizing-cells-uitableview-auto-layout/ Dies hat Schritt für Schritt infs.

+1

Ich habe alles was du hier stellst. Ich denke, das Problem ist, dass ich die Benutzeroberfläche in einem asynchronen Callback von Firebase (ich verwende Firebase als Backend) gesetzt habe. Bevor also die eigentlichen Daten im Hintergrund gesetzt werden, hat AutoLayout bereits die Höhe abgeleitet, bevor die Daten erhalten werden. Deshalb rufe ich die reloadrows-Methode auf, um zu erzwingen, dass die Zelle neu geladen wird, damit die AutoLayout-Funktion Einschränkungen basierend auf zurückgegebenen Daten festlegen kann. Haben Sie schon einmal eine solche Situation erlebt? Vielen Dank für Ihre Antwort! –

+0

@carl Pfanne, erhalten Sie irgendwelche Störungen beim Scrollen in der Tischansicht? – karthik

+0

Ja, ich sehe seltsame Bounces beim Scrollen. –

Verwandte Themen