Ich glaube, Sie interpretieren das, was Sie sagen, falsch. CGContextSaveGState()
y CGContextRestoreGState()
tun. Sie schieben den aktuellen Grafikstatus auf einen Stapel und heben ihn wieder auf, so dass Sie die aktuelle Zeichenfläche transformieren, Linienstile ändern usw. und dann den Zustand wiederherstellen können, der vor dem Setzen dieser Werte bestand. Es werden keine Zeichenelemente wie Pfade gespeichert.
Von der Dokumentation zu CGContextSaveGState() :
E Stapel von Grafikzuständen. Beachten Sie, dass nicht alle Aspekte der aktuellen Zeichenumgebung Umgebung sind Elemente des Grafikstatus sind. [ ] aktuelle Pfad wird nicht als Teil des des Grafikstatus und wird daher [ ] CGContextSaveGState()
Funktion.
Der Grafikstatus-Stapel sollte zu Beginn Ihrer drawRect:
Deshalb erhalten Sie Fehler, wenn Sie versuchen, einen Grafikstatus vom Stapel zu nehmen. Da Sie keinen auf den Stapel geschoben hatten, gab es auch keinen zu entfernen. All dies bedeutet, dass Sie Ihre Zeichnung nicht als Grafikstatus auf dem Stack speichern und später wiederherstellen können.
Wenn Sie sich nur um die Zwischenspeicherung Ihrer Zeichnung sorgen, wird das für Sie von der CALayer
die Ihr UIView
(auf dem iPhone). Wenn Sie Ihre Ansicht nur verschieben, wird sie nicht neu gezeichnet. Sie wird nur gezeichnet, wenn Sie dies manuell anweisen. Wenn Sie einen Teil der Zeichnung aktualisieren müssen, empfehle ich, die statischen Elemente in eigene Ansichten aufzuteilen oder CALayers
so dass nur der Teil, der sich ändert, neu gezeichnet wird.