Ich habe eine UICollectionView in meiner App, und jede Zelle ist eine UIImageView und einige Textbeschriftungen. Das Problem ist, dass wenn ich die UIImageViews ihre Bilder anzeigen lasse, die Scroll-Performance schrecklich ist. Es ist bei weitem nicht so flüssig wie das Scroll-Erlebnis eines UITableView oder sogar desselben UICollectionView ohne das UIImageView.
Ich habe diese Frage von vor ein paar Monaten, und es scheint wie eine Antwort gefunden wurde, aber es ist in RubyMotion geschrieben, und ich verstehe das nicht. Ich habe versucht, zu sehen, wie ich es in Xcode umwandeln kann, aber da ich auch nie NSCache benutzt habe, ist es etwas schwierig. Das Poster dort zeigte auch auf here < Ich möchte etwas zusätzlich zu ihrer Lösung implementieren, aber ich bin mir nicht sicher, wo ich diesen Code auch einfügen soll. Möglicherweise, weil ich den Code aus dem erste Frage .
Würde jemand in der Lage sein, dies in Xcode zu übersetzen?
%Vor%Hier ist der Code von zweite Frage , dass der Fragesteller der erste Frage sagte das Problem gelöst:
%Vor%Ich bin mir nicht sicher, wie / wo ich das umsetzen soll.
Vielen Dank.
Hier ist das Muster, dem ich folge. Laden Sie asynch immer und speichern Sie das Ergebnis zwischen. Nehmen Sie keine Annahme über den Status der Ansicht vor, wenn die Asynch-Last abgeschlossen ist. Ich habe eine Klasse, die die Lasten wie folgt vereinfacht:
%Vor%Jetzt ist die Aktualisierung der Zelle (Sammlung oder Tabelle) ziemlich einfach:
%Vor%Im Allgemeinen tritt ein schlechtes Scrollverhalten für UICollectionViews oder UITableViews auf, da die Zellen im Hauptthread von iOS aus der Warteschlange entfernt und konstruiert werden. Es gibt wenig Freiheit, Zellen zu pricazieren oder sie in einem Hintergrund-Thread zu konstruieren, stattdessen werden sie aus der Warteschlange entfernt und so konstruiert, dass Sie blättern und die Benutzeroberfläche blockieren. (Persönlich finde ich dieses schlechte Design von Apple, obwohl es die Dinge vereinfacht, weil Sie sich nicht über potenzielle Threading-Probleme bewusst sein müssen. Ich denke, dass sie einen Haken für eine benutzerdefinierte Implementierung für einen UICollectionViewCell / UITableViewCell-Pool geben sollten kann die Auslagerung / Wiederverwendung von Zellen handhaben.)
Die wichtigsten Ursachen für Leistungseinbußen sind in der Tat auf Bilddaten zurückzuführen und (in abnehmender Größenordnung) sind nach meiner Erfahrung:
Da ich beim glatten Scrollen sehr wählerisch bin (auch wenn es nur das erste Mal ist, dass eine Zelle verwendet wird), habe ich ein ganzes Framework erstellt, um Zellen durch Unterklassenbildung von UINib zu priaken (dies ist im Prinzip der einzige Haken, den man beim Auslagerungsprozess von iOS). Aber das könnte über deine Bedürfnisse hinausgehen.
Ich hatte Probleme mit UICollectionView
scrolling.
Was (fast) wie ein Zauber für mich funktionierte: Ich bevölkerte die Zellen mit PNG Thumbnails 90x90. Ich sage fast, weil die erste vollständige Scroll nicht so glatt ist, aber nie mehr abgestürzt ist.
In meinem Fall ist die Zellengröße 90x90.
Ich hatte vorher viele originale PNG-Größen und es war sehr unruhig, wenn png Originalgröße größer als ~ 1000x1000 war (viele Abstürze beim ersten Scrollen).
Also wähle ich 90x90 (oder ähnliches) auf dem UICollectionView
und zeige die originalen PNGs (unabhängig von der Größe) an. hoffe, es kann anderen helfen.
Tags und Links objective-c performance uicollectionview uicollectionviewcell rubymotion