2013-03-19 6 views
22

Istnieją dwie metody drawRect:CGContextSaveGState vs UIGraphicsPushContext

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

I

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

UIGraphicsPushContext/UIGraphicsPopContext są od UIKit podczas CGContextSaveGState/CGContextRestoreGState są od CoreGraphics.

Pytania: Jaka jest różnica między tymi metodami? Którego lepiej użyć? Czy istnieją przykłady udowodnienia jednej metody lepiej niż inne i vice versa?

Odpowiedz

34

UIGraphicsPushContext(context) popycha kontekst na stosie CGContextRefs (co kontekst bieżący kontekst rysowania), natomiast CGContextSaveGState(context) popycha aktualny stan graficznej na stos grafiki states prowadzonego przez kontekście. Powinieneś użyć UIGraphicsPushContext, jeśli chcesz utworzyć nowy CGContextRef z bieżącym kontekstem rysowania i powinieneś użyć CGContextSaveGState, gdy pracujesz z jednym kontekstem graficznym i chcesz tylko zapisać, na przykład: bieżący stan transformacji, kolory wypełnienia lub obrysu, itp.

0

UIGraphicsPushContext (ctx) jest przydatny, gdy chcesz rysować za pomocą UIkit, a bieżący kontekst nie jest kontekstem, w którym chcesz rysować. Używasz tej funkcji, aby kontekst, który chcesz narysować, stał się aktualny kontekst. CGContextSaveGState (ctx) Zapisz kontekst (określony przez ctx), później można przywrócić kontekst użycia CGContextRestoreGState()