Ich versuche, einen CGContext zu speichern und wiederherzustellen, um zu vermeiden, dass die Berechnungen zum zweiten Mal stark gezeichnet werden, und ich bekomme den Fehler <Error>: CGGStackRestore: gstack underflow
.
Was mache ich falsch? Was ist der richtige Weg, dies zu tun?
%Vor% Ich denke, Sie könnten falsch interpretieren, was CGContextSaveGState()
und CGContextRestoreGState()
tun. Sie schieben den aktuellen Grafikzustand auf einen Stapel und entfernen ihn, um den aktuellen Zeichenbereich zu transformieren, Linienstile zu ändern usw. und dann den Zustand wiederherzustellen, der vor dem Festlegen dieser Werte vorlag. Zeichnungselemente wie Pfade werden nicht gespeichert.
Aus der Dokumentation auf CGContextSaveGState () :
Jeder Grafikkontext pflegt a Stapel von Grafikzuständen. Beachten Sie, dass nicht alle Aspekte der aktuellen Zeichnung Umwelt sind Elemente der Grafikzustand. Zum Beispiel, die Der aktuelle Pfad gilt nicht als Teil von der Grafikzustand und ist daher nicht gespeichert, wenn Sie den Anruf tätigen
CGContextSaveGState()
Funktion.
Der Grafikstatus-Stack sollte zu Beginn von drawRect:
zurückgesetzt werden, weshalb beim Versuch, einen Grafikstatus vom Stapel zu entfernen, Fehler auftreten. Da du es nicht weitergeschoben hast, gab es keins, das abspringen könnte. All dies bedeutet, dass Sie Ihre Zeichnung nicht als Grafikstatus auf dem Stapel speichern und später wiederherstellen können.
Wenn Sie sich nur Sorgen um das Zwischenspeichern Ihrer Zeichnung machen, wird dies für Sie von der CALayer
erledigt, die Ihre UIView
(auf dem iPhone) unterstützt. Wenn Sie nur Ihre Ansicht verschieben, wird sie nicht neu gezeichnet. Es wird nur gezeichnet, wenn Sie es manuell dazu sagen. Wenn Sie einen Teil der Zeichnung aktualisieren müssen, empfehle ich, die statischen Elemente in ihre eigenen Ansichten oder CALayers
zu zerlegen, so dass nur der Teil, der sich ändert, neu gezeichnet wird.
Wollen Sie nicht zuerst speichern und dann wiederherstellen? Wenn Sie vor einem Speichervorgang wiederherstellen, gibt es keinen wiederherzustellenden Kontext und Sie erhalten einen Unterlauf.
Hier ist die Art, wie ich es benutzt habe:
%Vor%oder:
%Vor%Vielleicht versuchst du etwas anderes zu tun.
.. Basierend auf Ihrem Code! Es scheint, dass Sie den Kontext wiederherstellen, bevor Sie ihn speichern. Erste Sache zuerst:
Pop
Store(push)
muss Restore(pop)
sein
CGCreate
, Beispielcode:
%Vor%Tags und Links iphone cgcontext core-graphics quartz-graphics