2012-04-14 17 views
1

Ich habe an benutzerdefinierten Zeichnungen mit drawRect in UIView-Unterklassen gearbeitet. Das ist cool, aber Sie müssen warten, bis das Ende der Laufschleife für drawRect aufgerufen wird, und ich frage mich, wie Sie Frame für Frame-Animationen steuern können, wo Sie die Zeichnungen im Laufe der Zeit ändern, oder wenn dies möglich ist? Vielleicht ist Quartz nicht wirklich für diese Art von animierten Grafiken gedacht? Ich nehme an, dass es vielleicht für statische Zeichnungen entworfen wurde, die sich nicht so häufig ändern.Kontinuierliche Zeichnung mit Quarz? Bild für Bild möglich?

Antwort

2

Quarz an sich ist nicht in der Lage, eine hohe Bildwiederholfrequenz aufrechtzuerhalten, da es jedes Mal neu gezeichnet werden muss. Aber Sie können Quartz mit CoreAnimation zusammenarbeiten lassen, um auf Quartz basierende Animationen zu haben. Die Idee dahinter ist, dass Sie zuvor gezeichneten Inhalt in CALayer-Objekte zwischenspeichern und CoreAnimation verwenden können, um den kontinuierlichen Zeichnungseffekt zu erstellen.

Ein gutes Beispiel für diese Technik ist in der AccelerometerGraph sample code provided by Apple zu sehen. In diesem Beispiel ist die UIView-Unterklasse, die diese Technik verwendet, das Objekt "GraphView". Im Grunde genommen zeichnet dieses Objekt als vollständig neu nur einen Teil des Graphen (die neu erzeugten Segmente), unterstützt es in einer dedizierten Schicht und animiert dann die Schichten, um die "Scroll-Graph" -Animation bereitzustellen.

Diese Technik funktioniert natürlich nur, wenn Sie die Zeichenelemente vollständig steuern können und diese inkrementelle Methode zum Hinzufügen von Objekten auf dem Bildschirm verwalten können. Natürlich werden die Dinge viel komplizierter, wenn Sie viele verschiedene Teile des Bildschirms neu zeichnen müssen und zuvor erzeugte Ebenen modifizieren müssen.

Jedenfalls einen Blick auf den erwähnten Code: es ist ziemlich interessant.

+0

das ist genial, danke für den Vorschlag – johnbakers

1

Ihre App sollte vor jedem Frame zur Run-Schleife zurückkehren. Führen Sie alle benutzerdefinierten Frame-Animationen zwischen den einzelnen Frames aus. Die Frame-für-Frame-Zeichnung in drawRect sollte also gut funktionieren. Dies funktioniert in iOS-Apps mit einer Frame-Aktualisierungsrate von 60 Hz, nicht nur für statische Ansichten, solange alle Methoden zwischen den Frame-Zeiten und Ihren drawRects schnell genug sind. Zerhacke sie wenn nötig.

+0

Ich schätze ich verstehe nicht * wenn * die Laufschleife endet und ein neuer Frame beginnt. Wo würde ich meine Frame-Animationslogik platzieren? Zum Beispiel, eine 'for' Schleife endet innerhalb der gleichen Laufschleife richtig? So wiederholten Aufrufe von 'setNeedsDisplay' innerhalb einer for-Schleife würde nicht funktionieren ... Die Zeichnung würde nur auftreten, wenn die Schleife beendet ist. – johnbakers

+0

@andrewx: Sie müssten Ihre for-Schleife und die Methode, die Ihre for-Schleife enthält, jede Frame-Zeit beenden, um der Ausführungsschleife das Zeichnen zu ermöglichen. Sie können in einem weiteren nachfolgenden Methodenaufruf in Ihre for-Schleifenlogik zurückkehren. Möglicherweise müssen Sie einige Status speichern und wiederherstellen. – hotpaw2

+0

klingt wie ich muss viel über die Verwaltung von Lauf-Schleifen lernen :) – johnbakers

Verwandte Themen