2009-06-06 12 views
0

Ich verwende einen Teil der Three20 Bibliothek in einem Projekt. Insbesondere eine Ansicht, bei der es sich im Wesentlichen um eine Tabellenansicht handelt, bei der die Bilder 4-mal quer durch jede Zelle verlaufen, um die Miniaturansicht der iPhone-App des iPhones nachzuahmen.Kann verhindert werden, dass eine UITableViewCell aus der Warteschlange entfernt wird?

Ich habe festgestellt, dass das Verhalten für jede Zelle aus der Warteschlange ist, sobald der Boden der Zelle den unteren Rand der Navigationsleiste erreicht (die durchscheinend ist, so dass wir es tatsächlich verschwinden sehen können). Das Problem dabei ist, dass jedes Mal, wenn eine Zelle aus der Warteschlange genommen und dann wieder angezeigt wird, die Bilder neu geladen werden, was dazu führt, dass das Scrollen bei allem, was sich jenseits eines langsamen Scrollens des Tisches befindet, sehr nervös wird. Ich weiß, dass die Zellen wiederverwendet werden, um die Speichernutzung zu minimieren, aber ist es möglich, zu verhindern, dass die Zellen aus der Warteschlange genommen werden? Oder die Grenze neu definieren, wenn sie für die Wiederverwendung vorbereitet wird, um einen größeren Puffer zu erstellen, so dass sie nur verschwinden, wenn sie eine bestimmte Anzahl von Reihen außerhalb des Bildschirms sind?

Antwort

2

Sie haben sich rückwärts zurückgezogen. UITableView wird nicht entfernt. Sie tun das, wenn Sie -dequeueResusableCellWithIdentifier: anrufen. "Aus der Warteschlange" zu entfernen bedeutet nicht "freizugeben". Es bedeutet "ziehe die Warteschlange von zwischengespeicherten, nicht mehr in Gebrauch befindlichen, wiederverwendbaren Zellen ab". Es heißt "aus der Warteschlange", weil es sich um eine FIFO-Schlange von Zellen handelt, und Sie ziehen die erste aus.

Wenn das Scrollen langsam ist, müssen Sie Ihre Zeichengeschwindigkeit verbessern, und vielleicht müssen Sie Zellen schneller zurückgeben, wenn UITableView danach fragt. Das System zum Herausnehmen von wiederverwendbaren Zellen besteht nicht darin, Speicher zu sparen (es kostet tatsächlich Speicher); es ist die Leistung zu verbessern. Sie wollen es nicht umgehen; Das ist genau die Situation, in der es helfen kann.

Also, wie zeichnen Sie diese Zellen, und wie konfigurieren Sie sie, wenn UITableView nach einem fragt? Dort finden wir Ihre Leistungsverbesserung.

+0

Danke für die Klarstellung.Ich verstehe die Bibliothek nicht vollständig und es ist nicht gut dokumentiert/es gibt nicht viele Kommentare im Code. [This] (http://github.com/joehewitt/three20/tree/b78944872623673b1329688fd59a5708f048bef8/src) ist die Bibliothek und [diese] (http://github.com/joehewitt/three20/blob/b78944872623673b1329688fd59a5708f048bef8/src/TTThumbsViewController. m) ist die Klasse selbst. Ich versuche, durch die importierten Klassen zu sehen, wo die eigentliche Konfiguration stattfindet. – shoreline

0

Ich glaube, dass Sie den Tabellenansichtsrahmen ändern möchten, um Ihre Navigationsleistenregion einzuschließen.

[self.tableView setFrame:GCRectMake(0,0,320,480)]; 

Sie sollten bedenken, dass dies möglicherweise einige anderen Probleme verursachen, da dieser Bereich als sichtbarer Bereich gezählt werden, und Sie werden unter Ihrer durchscheinend Navigationsleiste nicht aus der ersten Zelle bewegen können, zu. Um dies umgehen Sie müssen möglicherweise Ihre tableView.tableHeaderView auf einen leeren UIView gesetzt, die der Höhe des UINavigationBar

entspricht (in der Theorie könnten Sie die gleichen Probleme mit einem UITabBar am unteren Rand Ihrer Ansicht haben).

+0

Wie hilft die Größenanpassung des TableView? –

+0

, da der Frame, der für die Berechnung verwendet wird, wenn eine Tabellenzelle sichtbar/nicht sichtbar ist, manchmal den falschen Wert haben kann. IE: Es ist nicht in der transparenten Navigationsleiste enthalten, da eine Navigationsleiste normalerweise nicht transparent ist und es normalerweise in Ordnung ist, dass Tabellenzellen zu diesem Zeitpunkt aus der Sicht entfernt werden. – Jehiah

0

Sie könnten versuchen, Ihre Bilder in ein NSMutableDictionary zu stellen. Überprüfen Sie an der Stelle, an der Sie Ihre Zelle erstellen, ob das gewünschte Bild bereits gespeichert ist. Wenn dies der Fall ist, verwenden Sie diese Kopie, falls nicht, laden Sie sie von wo immer Sie die Bilder ursprünglich erhalten, und legen Sie sie im Wörterbuch ab. Ich denke, dass ich ein NSMutableDictionary mit dem Image-Bezeichner als Schlüssel und dem Image als Wert dafür verwendet habe und das Scrollen der Tabelle beschleunigt hat.

Möglicherweise möchten Sie das NSMutableDictionary entladen, wenn Sie eine Speicherwarnung erhalten.

Ihr Problem kann nur sein, dass Sie Bilder über das Netzwerk laden, die Scrollen ruckelt macht. Hier finden Sie eine Lösung.

Preloading images from URL in TableViewCell

+0

Die Miniaturansichten werden aus dem Dokumentenverzeichnis der App geladen. Aber ich habe bemerkt, dass das Verhalten der Facebook-App, auf der die Daumenansicht basiert, die Zelle erstellt und dann den Daumen hinzufügt, wenn er abgerufen wird. Diese Methode hat nicht das gleiche Stottern. – shoreline

+0

Ändern Sie die Größe Ihrer Daumen oder maskieren Sie sie? Wenn vor dem Laden der Bilder in die Zelle eine zusätzliche Verarbeitung erfolgt, wird die Anzeige der Zelle verzögert. Wenn dies der Fall ist, wird das Speichern der verarbeiteten Bilder die Arbeit beschleunigen. –

+0

Die Daumen werden verkleinert; Sie werden erstellt, wenn die Dateien in das Dokumentenverzeichnis geschrieben werden. Ich habe versucht, mit dem Reduzieren der Dateigröße weiter zu spielen, sowohl durch Ändern der Daumenmaße als auch der Bildqualität, als es geschrieben wurde, aber die Abnahme der Bildqualität war die Leistungssteigerung nicht wert. Ich habe festgestellt, dass die Facebook-App nicht wirklich die Zelle selbst "löscht", wenn es aus dem Bildschirm geht, nur der Daumen wird freigegeben und dann einzeln nachgezogen, wenn die Zellen wieder in Sicht kommen. Ich bin mir nicht sicher, warum Three20 sich unterscheidet, es sei denn, der Schöpfer hat etwas verändert. – shoreline

0

versuchen, seine Wiederverwendung Kennung zu ändern. Und wenn Sie es aus der Warteschlange nehmen möchten, ändern Sie die Kennung erneut zurück. Ich habe es noch nicht versucht, aber das könnte funktionieren!

+0

Ich habe es versucht, aber reuseIdentifier ist readonly. Schade... – user500

Verwandte Themen