UITableViewCell-Frame-Höhe stimmt nicht mit tableView überein: heightForRowAtIndexPath:

Ich konstruiere eine UITableView mit benutzerdefinierten Tabellenzellen mit variabler Höhe, deren Höhe durch die Größe eines enthaltenen mehrzeiligen UILabels bestimmt wird. Ich habe dietableView:heightForRowAtIndexPath: Delegate-Methode verkabelt und Berechnung der endgültigen Höhe korrekt mitsizeWithFont:constrainedToSize:.

Ich bin auf ein seltsames Problem gestoßen: Bis zum Zeitpunkt der DatenquellenmethodetableView:cellForRowAtIndexPath: wird aufgerufen, die richtige Zeilenhöhe wurde bereits wie oben beschrieben bestimmt, aber der Rahmen der Zelle stimmt nicht mit dieser Höhe überein. Stattdessen dieframe.size.height Die Eigenschaft der Zelle ist die Standardzellenhöhe der Tabellenansicht (86 px, wie ich sie im Interface Builder festgelegt habe, die richtige Höhe, wenn das enthaltene UILabel nur eine Textzeile enthält), anstatt die Höhe zu sein, dietableView:heightForRowAtIndexPath: richtig für diesen Indexpfad bestimmt.

Ich produziere die Zellen incellForRowAtIndexPath: unter Verwendung von Dequeuing, das heißt,

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel

Was auch immer iOS hinter den Kulissen tut, die Ausreihung setzt die Frame-Eigenschaft der Zelle nicht so, dass sie mit der berechneten Höhe übereinstimmt. Dies ist an sich nicht überraschend, da sich das Dequeuing mit Zellinstanzen befasst, nicht mit deren Geometrie. Die Zellen werden jedoch korrekt gerendert, sodass die height -Eigenschaft festgelegt wirdirgendwo, aber es passiert nachcellForRowAtIndexPath:.

Also: Wenn ich zum ersten Mal die Tabellenansicht auffülle,cell.frame.size.height ist 86 für alle Zellen, wie sie zum ersten Mal angezeigt werden, wenn ich die Liste nach unten scrolle. Da wird die richtige Geometrie irgendwann nach der ersten eingestelltcellForRowAtIndexPath: Wenn ich einen Bildlauf nach oben durchführe, ist die Eigenschaft height für jede Zeile vor der Anzeige für jede Zelle korrekt, die nach der Wiederverwendung wieder angezeigt wird.

Danach kann ich die Tabellenansicht nach Belieben hin und her scrollen, und die height -Eigenschaft bleibt von diesem Punkt an für jede Zelle korrekt.

Wie lässt sich die richtige Zellenhöhe beim ersten Mal ermitteln, bevor eine erneute Verwendung aufgrund von Warteschlangen erfolgt? Ich brauche dies, um die Unteransichten der Tabellenzelle ein wenig neu zu positionieren. Muss ich manuell anrufenheightForRowAtIndexPath: imcellForRowAtIndexPath: und dann den Frame der neu erstellten CustomCell-Instanz manuell auf diese Höhe einstellen? Dies scheint redundant zu sein, und ich muss einen Mechanismus erstellen, um zu erkennen, wann die Zelle zum ersten Mal mit der falschen Rahmenhöhe erstellt wird, und wann sie später mit der richtigen Rahmenhöhe in die Warteschlange gestellt wird, um diese Redundanz zu vermeiden.

Wenn also jemand etwas Licht in die Logik dahinter bringen kann, würde ich es begrüßen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage