Speichern und wiederherstellen CGContext
Ich versuche, zu speichern und wiederherzustellen eine CGContext zu vermeiden, schwere, Zeichnung, Berechnungen für ein zweites mal und ich bin immer der Fehler <Error>: CGGStackRestore: gstack underflow
.
Was mache ich falsch? Was ist der richtige Weg, dies zu tun?
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
if (initialized) {
CGContextRestoreGState(context);
//scale context
return;
}
initialized = YES;
//heavy drawing computation and drawing
CGContextSaveGState(context);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie könnten falsch interpretiert, was
CGContextSaveGState()
undCGContextRestoreGState()
tun. Sie schieben die aktuellen Grafikzustand auf einen Stapel und knallen ihn ab, lassen, verwandeln Sie die aktuelle Zeichnung Platz, ändere die Zeile styles, etc., dann wieder der Staat zu dem, was es war, bevor Sie die Werte einstellen. Es speichert keine Zeichnung Elemente, wie Wege.Aus der Dokumentation auf CGContextSaveGState():
Graphics state stack zurückgesetzt werden sollen zu Beginn Ihrer
drawRect:
, das ist, warum Sie Fehler erhalten, wenn Sie versuchen, pop-Grafiken-Zustand aus dem Stapel. Da Sie nicht hatte, drückte, es war niemand, um pop-off. All dies bedeutet, dass Sie können nicht speichern Sie Ihre Zeichnung als Grafik-Zustand auf den stack, dann später wiederherstellen.Wenn man besorgt ist die Zwischenspeicherung Ihre zeichnen, das ist für Sie getan, indem Sie die
CALayer
dass Rücken IhremUIView
(auf dem iPhone). Wenn alles, was Sie tun, ist Bewegung Ihre Anzeige um, es wird nicht neu gezeichnet werden. Es wird nur gezogen werden, wenn Sie manuell sagen, es zu tun. Wenn Sie haben, um update-Teil der Zeichnung, dem empfehle ich die Aufteilung der statischen Elemente aus, die in Ihren Ansichten oderCALayers
so, dass nur der Teil der änderungen neu gezeichnet wird.Willst du nicht vorher Speichern und dann Wiederherstellen? Wenn Sie wiederhergestellt werden, bevor ein speichern, dann gibt es keinen Kontext wiederherzustellen, und Sie würden sich einen Unterlauf.
Hier ist die Weise, die ich verwendet haben:
oder:
Vielleicht sind Sie versucht, etwas anderes zu machen.
.. Basierend auf Ihren code !,
Es scheint, dass Sie die Wiederherstellung der Kontext, bevor Sie es Speichern.
Erste Sache Zuerst:
Pop
Store(push)
es mussRestore(pop)
CGCreate
,CGCopy
,Beispielcode: