2014-05-17 4 views
12

Wenn ich reloadData-Methode von UICollectionView aufrufen, verursachen alle sichtbare Zelle zu blinken. Ich fand, dass der Grund dafür Erholung aller sichtbaren Zellen ist, während UITableView sichtbare Zelle in - tableView: cellForRowAtIndexPath: Methode nach dem Neuladen von Daten zurückgibt.UICollection-Ansicht reloadData Ursache Erstelle sichtbare Zelle neu

Also, wie kann ich die Wiederherstellung von sichtbaren Zellen in UICollectionView vermeiden.

Antwort

4

Durch Aufrufen von reloadData in einer Tabellen- oder einer Sammlungsansicht werden alle (sichtbaren) Zellen neu erstellt (aus der Warteschlange entfernt) und die Informationen zur Zeilen-/Elementanzahl und zur Höhe des Anzeigeinhalts aktualisiert. Sie werden also immer ein "Blinzeln" sehen, weil es animiert ist.

Dieses Verhalten ist beabsichtigt den Benutzer zu informieren, dass alles nur aktualisiert wurde ...

Animation zu vermeiden, sollte reloadData nicht nennen. Verwenden Sie stattdessen visibleCells, um alle aktuell auf dem Bildschirm vorhandenen Zellen abzurufen und ihre Inhalte direkt zu aktualisieren.

+0

Als ich reload für Tableview in 'Tableview nennen: cellForRowAtIndexPath:' Ich bekomme sichtbare Zelle mit zuvor geladenen Daten. Wenn ich zum Beispiel imageView und image nicht ändere, aktualisiere ich es nicht und vermeide es zu blinken. Aber für die Sammlungsansicht nach reloadData bekomme ich völlig neue Zelle - derzeit nicht sichtbar Zelle mit zuvor geladenen Daten. – abagmut

+0

Ob Sie eine wiederverwendbare Zelle "bekommen", ist nicht spezifisch für die Tabellen- oder Sammlungsansicht, sondern eher für das Scrollen, das Sie gemacht haben oder für das vorherige Laden. Und Sie sollten die Zelle immer neu konfigurieren - woher wissen Sie, in welcher Zeile sie zuvor verwendet wurde? – Wain

+0

Ich rufe reloadData auf, wenn collectionView nicht scrollt. Es ist nicht notwendig zu wissen, für welche Zeile es vorher verwendet wurde. Speichern Sie einfach den Bildnamen für das Bild, der gerade in der Zelle geladen ist, und wenn er nach dem Neuladen übereinstimmt (für TableView, wenn sich die Zellendatenquelle nicht ändert - ist sie wahr), tun Sie nichts. – abagmut

1

Sie können versuchen, https://github.com/ba01ei/PSTImprovedCollectionView

Mit dieser Kollektion Ansicht, wenn Sie reload nennen, wenn eine Zelle noch sichtbar ist, wird die gleiche Zelle aus der Warteschlange zurückgeschickt wird (dann können Sie das Datenmodell an der Zelle angebracht überprüfen und entscheiden, ob sie neu zu rendern)

6

Sie müssen die sichtbaren Zellen laden, die der Blitz nicht verursachen gesehen während reloadData:

[myCollectionView reloadItemsAtIndexPaths:[myCollectionView indexPathsForVisibleItems]];

-1

Swift Version:

if let indexPath = collectionView?.indexPathsForVisibleItems { 
    collectionView?.reloadItems(at: indexPath) 
} 
-1

try this:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [weakSelf.collectionView reloadData]; 
}); 
Verwandte Themen