Speichern und Wiederherstellen von CGContext

8

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%     
cocoatoucher 18.09.2009, 19:30
quelle

3 Antworten

17

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.

    
Brad Larson 18.09.2009 22:24
quelle
5

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.

    
mahboudz 18.09.2009 19:46
quelle
0

.. Basierend auf Ihrem Code! Es scheint, dass Sie den Kontext wiederherstellen, bevor Sie ihn speichern. Erste Sache zuerst:

  1. Erstellen Sie einen Kontext
  2. Speichere seinen Status, aka push
  3. Mach etwas mit dem Kontext
  4. Stelle den Kontext wieder her aka Pop
  5. Allgemeine Regel für jedes Store(push) muss Restore(pop) sein
  6. Geben Sie den Kontext frei, wenn Sie damit fertig sind!, Dies bezieht sich auf den Kontext, in dem% ce_de%, CGCreate ,
  7. steht

Beispielcode:

%Vor%     
abdimuna 27.10.2013 22:05
quelle