2013-03-19 11 views
22

Es gibt zwei Methoden drawRect:CGContextSaveGState vs UIGraphicsPushContext

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    // do drawing here 
    CGContextRestoreGState(context); 
} 

Und

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    UIGraphicsPushContext(context); 
    // do drawing here 
    UIGraphicsPopContext(); 
} 

UIGraphicsPushContext/UIGraphicsPopContext sind von UIKit während CGContextSaveGState/CGContextRestoreGState von Core Graphics sind.

Fragen: Was ist der Unterschied zwischen diesen Methoden? Welcher ist besser zu benutzen? Gibt es Beispiele dafür, eine Methode besser als die andere zu beweisen und umgekehrt?

Antwort

34

UIGraphicsPushContext(context) schiebt Kontext auf einen Stapel von CGContextRefs (Herstellung Kontext der aktuellen Zeichnungskontext), wohingegen die aktuelle CGContextSaveGState(context) Grafikzustand auf den Stapel von Grafiken schiebt Zustände von Rahmen gehalten. Sie sollten UIGraphicsPushContext verwenden, wenn Sie einen neuen CGContextRef zum aktuellen Zeichnungskontext machen müssen, und Sie sollten CGContextSaveGState verwenden, wenn Sie mit einem Grafikkontext arbeiten und nur speichern möchten, zum Beispiel: den aktuellen Transformationsstatus, Füll- oder Strichfarben, usw.

0

UIGraphicsPushContext (ctx) ist nützlich, wenn Sie mit UIkit zeichnen möchten und der aktuelle Kontext nicht der Kontext ist, den Sie zeichnen möchten. Verwenden Sie diese Funktion, um den Kontext, den Sie zeichnen möchten, aktuell zu machen Kontext. CGContextSaveGState (ctx) Speichern Kontext (referated by CTX), später können Sie den Kontext wiederherstellen CGContextRestoreGState()