2009-09-21 15 views
5

Ich möchte meine Tabellenansicht Zellen aus der Zelle statt der UITableViewDelegate Größe ändern. Ich ändere die Größe basierend auf asynchronem Inhalt, so dass ich sie im Delegaten nicht anpassen kann.Ist es möglich, eine UITableViewCell in der Größe zu ändern, ohne UITableViewDelegate zu verwenden?

Ich versuchte Einstellung self.frame in der Zelle, aber die Tabellenansicht war wirklich unglücklich darüber. Die Zellen überschnitten sich und alle Arten von Verrücktheit gingen weiter.

Antwort

5

Sie müssen lediglich die Tabellenansicht verwenden Höhe zu steuern. Sie können die Tabelle ändern, die eine Zelle geändert hat, indem Sie die Aufrufe verwenden, um bestimmte Zellen zu entfernen und dann wieder hinzuzufügen, sodass Sie die gesamte Tabelle nicht erneut laden müssen. Die Höhe muss jedoch mithilfe der Delegat-Callback-Tabelle abgerufen werden: heightForRow: atIndexPath:

Ich sehe nicht, warum das nicht praktisch ist. Sie können eine beliebige Anzahl von asynch-Systemen ausführen, die einen zentralen Höhenzwischenspeicher des Tabellenansichtsdelegaten aktualisieren. Jedes Mal, wenn Sie eine Zelle erstellen, können Sie ihr den Delegierten als Referenz zuweisen, so dass sie zurück in die Tabelle sprechen kann Es weiß, dass Zellen neu geladen werden müssen und was die neuen Höhen sind. Wenn Sie darüber nachdenken, ist die schlechte Tabellenansicht eine Bildlaufansicht, die alle diese separaten Zellen verwalten und visuell zusammenhalten muss - so ist es wirklich unfreundlich von einer Zelle, betrügerisch zu werden und Frames zu verändern, ohne den Tisch zu lassen mal sehen was sowieso los ist. Es ist am besten, den Tisch fahren zu lassen und ihm zu sagen, was zu tun ist.

+0

Ja, wenn Sie [tableView reloadData] aufrufen, ruft sie die Delegate-Methode 'tableView: heightForRow: atIndexPath:' auf, in der Sie die entsprechenden Zellenhöhen anhand Ihrer Daten berechnen können. Denken Sie jedoch daran, dass dies in Bezug auf die Scroll-Performance teuer werden kann, wenn Sie sehr große Zellen oder viele davon haben. – runmad

+0

Aus diesem Grund ist der Bereich für den Höhencache sehr wichtig. Sie müssen also nicht viel arbeiten, um dem System mitzuteilen, wie hoch die Höhe ist. –

+1

Sie müssen [tableView reloadData] nicht aufrufen, wie es von Canada Dev vorgeschlagen wird. Sie können stattdessen [tableView beginUpdates] aufrufen; [tableView endUpdates]; Dies führt dazu, dass die TableView jede Zelle neu misst (Aufruf von heightForForRow: atIndexPath: für jede Zelle), ohne jede Zelle neu zu laden. – TomSwift

0

Sie sollten versuchen, die Zellen content propertys Rahmen zu verwalten, statt die Zellen Rahmen selbst heren eine Referenz http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/contentView

+0

Ich bin Ansichten in der ContentView hinzufügen. Ich verändere 'self.frame' anstelle von' self.contentView.frame', da contentView die Größe automatisch mit der autoResizingMask ändert. Wie auch immer, das Setzen des Rahmens von 'self.view' oder' self.contentView' behebt das Problem nicht. Das TableView ist immer noch sehr verwirrt, wenn Sie es von innerhalb der Zelle aus anpassen. –

1

Nein, Sie können die Zellengröße nicht einstellen, ohne die UITableViewDelegate zu verwenden. Ändern der Größe der Zelle mit tatsächlich ändern Sie die Größe der Zelle, aber es ändert sich nicht die Offsets, die UITableView zeichnet die Zellen mit. Das führt zu Überschneidungen und Lücken überall.

Ihr Freund ist tableView:heightForRowAtIndexPath:, und es sollte schnell sein. Wenn Sie es überschreiben, kann die Tabellenansicht nicht länger davon ausgehen, dass alle Zeilen die gleiche Höhe haben. Und so muss es alle Zeilen für ihre Höhe jedes Mal abfragen, wenn es Zellen zum Zeichnen holt.

Verwandte Themen