web-dev-qa-db-de.com

iOS 8 Automatische Höhenzelle beim ersten Laden nicht korrekt

Ich habe eine iOS 8-Anwendung, auf der ich eine Suchergebnisseite habe, bei der jede Zelle basierend auf der Höhe eines bestimmten Labels automa- tisiert wird. Nach dem ersten Laden der Ansicht werden die angezeigten Zellen jedoch nicht automatisch skaliert. Nachdem Sie nach unten gescrollt haben, werden die folgenden Zellen korrekt dimensioniert. Ich verdoppele die Einschränkungen für das automatische Layout in meinem Storyboard. Ich habe den folgenden Code in viewDidLoad.

- (void)viewDidLoad {
    [super viewDidLoad];

    //configure tableView so that we use autolayout enabled row heights
    self.tableView.estimatedRowHeight = 68;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}

Hat das noch jemand erlebt?

22
Dennis

Ja, ich habe das gleiche Problem gesehen, als ich die Ansichten und Einschränkungen im Storyboard erstellte (jedoch nicht mit Ansichten, die durch Code hinzugefügt wurden). Iv'e behebt dies, indem er diesen Code in die benutzerdefinierte Zellklasse einfügt.

-(void)didMoveToSuperview { 
    [self layoutIfNeeded];
}

Dies könnte wahrscheinlich an andere Orte gehen, aber diese Methode scheint nur einmal aufgerufen zu werden, daher dachte ich, dass dies ein guter Ort dafür wäre.

31
rdelmar

Die Antwort von rdelmar hat bei mir nicht funktioniert.

Was ich getan habe, ist dieser Code hinzugefügt:

[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData];

nachdem die Daten abgerufen wurden und der erste [tableView reloadData] aufgerufen wird, der sich in meinem Fall in der viewDidLoad-Methode meines View Controllers befindet.

Ergebniscode wäre also:

NSArray *fetchedData = ...

[tableView reloadData]; //Fist table reload
[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData]; //Second table reload

Diese Antwort stammt von hier: http://useyourloaf.com/blog/self-sizing-table-view-cells.html#comment-1783719287

20
Sihad Begovic

Ich denke, anstatt eine tableView.reloadData() und tableView.layoutIfNeeded() in viewDidLoad zu erzwingen, können Sie einfach die automatische Höhe Ihres tableView in viewWillLayoutSubviews() einstellen:

Schnell: 

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableView.estimatedRowHeight = 300
    tableView.rowHeight = UITableViewAutomaticDimension
}
1
leonardloo

Ich hatte das gleiche Problem und es wurde behoben, indem Zuweisungen in die Texteigenschaften der UILabels der Zelle verschoben wurden (da dies die einzigen Komponenten sind, die die Höhenberechnung in meiner bestimmten Zelle beeinflussen konnten):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

anstatt:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

Bevor ich dies tat, fiel mir auf, dass die Zellenhöhe korrekt berechnet würde, wenn eine Zelle vorübergehend vom Bildschirm gescrollt und dann wieder in Sichtweite gerückt wurde. Höchstwahrscheinlich, weil die Zelle zu diesem Zeitpunkt über die notwendigen Informationen bezüglich des UILabel-Inhalts verfügte, der die endgültige Höhe festlegte.

1
lpa

Ich konnte dieses Problem umgehen, indem ich keine Nibs/Storyboards verwendete, sondern das Layout programmgesteuert ausführen ließ.

0
Angela C