Meine App muss Tabellenzellen mit variabler Höhe haben (da sich in jeder Tabellenzelle die Höhe unterscheidet, muss nicht jede Zelle in der Lage sein, ihre Größe zu ändern).Wie kann ich Tabellenzellen mit variabler Höhe auf dem iPhone richtig machen?
Ich habe eine Lösung, die derzeit funktioniert, aber es ist kludgy und langsam.
Meine aktuelle Lösung:
Bevor die Tabellenzellen gemacht werden, ich berechnen, wie hoch jede Zelle durch den Aufruf Sizing Methoden wie -sizeWithFont:constrainedToSize:
auf seine Daten sein muss. Ich addiere dann die Höhen, erlaube eine Auffüllung und speichere das Ergebnis mit den Daten.
Dann, wenn mein UITableViewDelegate die -tableview:heightForRowAtIndexPath:
empfängt, arbeite ich aus, welches Element für diese Zelle gerendert wird, und gebe die Höhe zurück, die ich vorher berechnet habe.
Wie gesagt, das funktioniert, aber -sizeWithFont:constrainedToSize:
ist sehr langsam, wenn Sie es für Hunderte von Elementen nacheinander tun, und ich fühle, dass es besser gemacht werden kann.
Damit dies funktioniert, musste ich zwei Codeabschnitte verwalten - einen, der die Zellenhöhen berechnen würde, und einen, der die Zellen tatsächlich zeichnen würde, wenn die Zeit gekommen ist.
Wenn etwas über das Modell geändert wurde, musste ich beide Code-Abschnitte aktualisieren, und hin und wieder passen sie immer noch nicht perfekt zusammen, was manchmal zu Tabellenzellen führt, die für einen gegebenen Wert etwas zu klein sind Artikel oder zu groß.
Mein Lösungsvorschlag:
Deshalb möchte ich mit der Vorberechnung die Zellenhöhe zu tun, weg. A) weil es das MVC-Paradigma bricht und B) weil es langsam ist.
Also zieht sich meine Zelle selbst und endet mit der richtigen Zellenhöhe. Mein Problem ist, dass ich keine Möglichkeit habe, der Tabelle die Höhe der Zelle vor dem Zeichnen zu zeigen - zu welcher Zeit es zu spät ist.
Ich versuchte -cellForRowAtIndexPath:
von innerhalb -tableView:heightForRowAtIndexPath:
zu rufen, aber das bleibt in einer Endlosschleife stecken, da der erste den zweiten irgendwann ruft, und umgekehrt (zumindest habe ich das gesehen, als ich es probierte).
So ist diese Option nicht in Frage.
Wenn ich keine Höhe in der Höhe für Zeilen Delegate Methode angeben, dann geht die Tabellenansicht screwwy. Die Zellen sind die perfekte Höhe, aber ihre x-Position ist die von Zellen mit festen Höhen.
Messed Table Cells http://jamsoftonline.com/images/messed_table_cells.png
Beachten Sie, wie die untere Zelle die richtige Größe hat - es ist überlappend nur die vorherige Zelle, und die vorherige Zelle überlappt seine frühere, und so weiter und so fort.
Bei der Verwendung dieser Methode treten beim Scrollen Artefakte auf, von denen ich denke, dass sie mit der Wiederverwendungskennung für die Zellen zusammenhängen.
So jede Hilfe hier wäre dankbar geschätzt.
Ich habe das gleiche Problem. -cellForRowAtIndexPath: calls -tableView: heightForRowAtIndexPath: wenn es in letzterem aufgerufen wird (beachte, dass es das letztere nicht anruft, wenn es nicht in letzterem aufgerufen wird), mache mich verrückt. – an0