CGContextSaveGState vs UIGraphicsPushContext
Существует два метода drawRect:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// do drawing here
CGContextRestoreGState(context);
}
и
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);
// do drawing here
UIGraphicsPopContext();
}
UIGraphicsPushContext/UIGraphicsPopContext от UIKit
а CGContextSaveGState/CGContextRestoreGState - от CoreGraphics.
Вопросы. В чем разница между этими методами? Какой из них лучше использовать? Есть ли примеры доказательства одного метода лучше других и наоборот?
Ответы
Ответ 1
UIGraphicsPushContext(context)
подталкивает контекст к стеку CGContextRefs (делая контекст текущим контекстом рисования), тогда как CGContextSaveGState(context)
подталкивает текущее состояние графики в стек графических состояний, поддерживаемых контекстом. Вы должны использовать UIGraphicsPushContext, если вам нужно сделать новый CGContextRef текущим контекстом рисования, и вы должны использовать CGContextSaveGState, когда работаете с одним графическим контекстом и хотите просто сохранить, например: текущее состояние преобразования, цвета заливки или штриха, и др.
Ответ 2
UIGraphicsPushContext (ctx) полезен, когда вы хотите рисовать с помощью UIkit, а текущий контекст - это не тот контекст, который вы хотите использовать. Вы используете эту функцию, чтобы контекст, который вы хотите использовать, стал текущим контекстом.
CGContextSaveGState (ctx) сохраняет контекст (указанный ctx), позже вы можете восстановить контекст, используя CGContextRestoreGState()