UICollectionView indexPathsForVisibleItems aktualisiert keine neuen sichtbaren Zellen

8

Ich habe einen ViewController mit einer CollectionView innerhalb. Wenn die Ansicht geladen wird, werden die sichtbaren Zellen (9 Zellen) korrekt angezeigt. Wenn ich nach unten scrolle, möchte ich die sichtbaren Elemente in der Sammlungsansicht mit loadImagesForOnscreenRows laden, indem ich die indexPathsForVisibleItems für partnerCollectionView aufruft. Aber bei loadImagesForOnScreenRows hat indexPathsForVisibleItems immer die ersten 9 Zellen, selbst wenn die Zellen 10 bis 18 auf dem Bildschirm sichtbar sein sollten. Der Code, den ich verwende, ist:

%Vor%

Und dieses Ergebnis in der Ausgabe:

Erste Show von sichtbaren Elementen

%Vor%

Nach dem Scrollen zu den Punkten 10 bis 19:

%Vor%

Wie Sie nach dem Scrollen sehen können, bleiben die Einträge der sichtbaren Indexpfade gleich. Ist jemand anderes auf diese oder eine Idee für eine Lösung gestoßen? Oder verstehe ich etwas Prinzip von Collectionview falsch?

Vielen Dank im Voraus! Mit freundlichen Grüßen, Jan

    
Jan Stulens 03.09.2013, 14:55
quelle

1 Antwort

5

Wenn Sie auf iOS 8.0 und höher abzielen, sollten Sie collectionView:willDisplayCell:forItemAtIndexPath: verwenden, um den Download zu starten. Wenn Sie iOS 7.0 verwenden, sollten Sie weiterhin collectionView:cellForItemAtIndexPath: verwenden.

In Ihrem imageLoaderDidFinishDownloading: Callback sollten Sie überprüfen, ob der betreffende Indexpfad noch sichtbar ist. Wenn dies der Fall ist, rufen Sie die entsprechende Zelle ab und aktualisieren Sie ihre Bildansicht. Wenn die Zelle nicht sichtbar ist, ist Ihre Arbeit erledigt. Das Aufrufen von -reloadData für jede Bildkomplettierung kostet eine Menge teuere Arbeit und könnte zu erheblichen UX-Problemen führen, wenn sich Ihr Benutzer gerade im mittleren Bildlauf der Tabelle befindet und Sie dessen Inhalt zurücksetzen. Sie tun möglicherweise auch die UIImageJPEGRepresentation() -Arbeit oft, es würde Ihre Scroll-Leistung helfen, wenn Sie diese Arbeit einmal in imageLoaderDidFinishDownloading: ausgeführt und dann zwischengespeichert haben.

Da es so aussieht, als ob der Callback auf einem Hintergrundthread stattfindet, vergewissere dich, dass du nur UICollectionView vom Hauptthread manipulierst.

    
jszumski 20.04.2015 17:31
quelle