Um den Zweck dieser Frage zu klären: Ich weiß, wie man komplizierte Ansichten mit beiden Unteransichten und mit drawRect erstellt. Ich versuche zu verstehen, wann und warum man übereinander verwendet.
Ich verstehe auch, dass es keinen Sinn macht, so viel im Voraus zu optimieren und etwas schwieriger zu machen, bevor Sie ein Profiling durchführen. Bedenken Sie, dass ich mit beiden Methoden vertraut bin und jetzt wirklich ein tieferes Verständnis möchte.
Ein großer Teil meiner Verwirrung ist darauf zurückzuführen, dass ich gelernt habe, wie man die Bildlaufleistung in der Tabellenansicht wirklich reibungslos und schnell macht. Natürlich stammt die ursprüngliche Quelle dieser Methode vom Autor hinter Twitter für iPhone (ehemals Tweetie). Grundsätzlich heißt es, dass das Geheimnis darin besteht, KEINE Unteransichten zu verwenden, um das Scrollen von Tabellen reibungslos zu gestalten, sondern die gesamte Zeichnung in einer benutzerdefinierten Ansicht zu erstellen. Im Wesentlichen scheint es, dass die Verwendung vieler Unteransichten das Rendern verlangsamt, da sie viel Overhead haben und ständig über ihren übergeordneten Ansichten neu zusammengesetzt werden.
Um fair zu sein, wurde dies geschrieben, als das 3GS ziemlich brandneu war und iDevices seitdem viel schneller geworden sind. Noch diese Methode wird regelmäßig vorgeschlagen auf den interwebs und anderswo für Hochleistungstabellen. Tatsächlich ist es eine empfohlene Methode in Apples Tabellenbeispielcode , die in mehreren WWDC-Videos ( Praktisches Zeichnen für iOS-Entwickler ) und vielen iOS- Programmierbüchern vorgeschlagen wurde .
Es gibt sogar fantastisch aussehende Tools , um Grafiken zu entwerfen und Core Graphics-Code für sie zu generieren.
Zuerst muss ich glauben: "Es gibt einen Grund, warum Core Graphics existiert. Es ist SCHNELL!"
Sobald ich jedoch auf die Idee komme, "Core Graphics nach Möglichkeit zu bevorzugen", stelle ich fest, dass drawRect häufig für eine schlechte Reaktionsfähigkeit in einer App verantwortlich ist, extrem teuer im Speicher ist und die CPU wirklich belastet. Grundsätzlich sollte ich vermeiden, drawRect zu überschreiben (WWDC 2012 iOS App Performance: Grafiken und Animationen )
Ich denke, wie alles ist es kompliziert. Vielleicht können Sie mir und anderen helfen, das Wann und Warum für die Verwendung von drawRect zu verstehen?
Ich sehe einige offensichtliche Situationen bei der Verwendung von Core Graphics:
- Sie haben dynamische Daten (Apple Stock Chart Beispiel)
- Sie haben ein flexibles UI-Element, das nicht mit einem einfachen Bild mit veränderbarer Größe ausgeführt werden kann
- Sie erstellen eine dynamische Grafik, die nach dem Rendern an mehreren Stellen verwendet wird
Ich sehe Situationen, um Core Graphics zu vermeiden:
- Die Eigenschaften Ihrer Ansicht müssen separat animiert werden
- Sie haben eine relativ kleine Ansichtshierarchie, sodass sich ein wahrgenommener zusätzlicher Aufwand bei der Verwendung von CG nicht lohnt
- Sie möchten Teile der Ansicht aktualisieren, ohne das Ganze neu zu zeichnen
- Das Layout Ihrer Unteransichten muss aktualisiert werden, wenn sich die Größe der übergeordneten Ansicht ändert
Geben Sie also Ihr Wissen. In welchen Situationen greifen Sie nach drawRect / Core Graphics (dies könnte auch mit Unteransichten erreicht werden)? Welche Faktoren führen Sie zu dieser Entscheidung? Wie / Warum wird das Zeichnen in einer benutzerdefinierten Ansicht für das Scrollen mit butterweichen Tabellenzellen empfohlen, Apple rät jedoch aus Leistungsgründen generell von drawRect ab? Was ist mit einfachen Hintergrundbildern (wann erstellen Sie sie mit CG oder mit einem anpassbaren PNG-Bild)?
Ein tiefes Verständnis dieses Themas ist möglicherweise nicht erforderlich, um lohnende Apps zu erstellen, aber ich mag es nicht, zwischen Techniken zu wählen, ohne erklären zu können, warum. Mein Gehirn wird sauer auf mich.
Frage Update
Vielen Dank für die Informationen an alle. Einige klärende Fragen hier:
- Wenn Sie etwas mit Kerngrafiken zeichnen, aber mit UIImageViews und einem vorgerenderten PNG dasselbe erreichen können, sollten Sie immer diesen Weg gehen?
- Eine ähnliche Frage: Wann sollten Sie vor allem bei Badass-Tools wie diesen in Betracht ziehen, Oberflächenelemente in Kerngrafiken zu zeichnen? (Wahrscheinlich, wenn die Anzeige Ihres Elements variabel ist. ZB eine Schaltfläche mit 20 verschiedenen Farbvarianten. Andere Fälle?)
- Könnten nach meinem Verständnis in meiner Antwort unten möglicherweise die gleichen Leistungssteigerungen für eine Tabellenzelle erzielt werden, indem eine Snapshot-Bitmap Ihrer Zelle nach dem Rendern Ihres komplexen UIView-Renderings effektiv erfasst und beim Scrollen und Ausblenden Ihrer komplexen Ansicht angezeigt wird? Offensichtlich müssten einige Stücke ausgearbeitet werden. Nur ein interessanter Gedanke, den ich hatte.