Подтвердить что ты не робот

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.

Вопросы. В чем разница между этими методами? Какой из них лучше использовать? Есть ли примеры доказательства одного метода лучше других и наоборот?

4b9b3361

Ответ 1

UIGraphicsPushContext(context) подталкивает контекст к стеку CGContextRefs (делая контекст текущим контекстом рисования), тогда как CGContextSaveGState(context) подталкивает текущее состояние графики в стек графических состояний, поддерживаемых контекстом. Вы должны использовать UIGraphicsPushContext, если вам нужно сделать новый CGContextRef текущим контекстом рисования, и вы должны использовать CGContextSaveGState, когда работаете с одним графическим контекстом и хотите просто сохранить, например: текущее состояние преобразования, цвета заливки или штриха, и др.

Ответ 2

UIGraphicsPushContext (ctx) полезен, когда вы хотите рисовать с помощью UIkit, а текущий контекст - это не тот контекст, который вы хотите использовать. Вы используете эту функцию, чтобы контекст, который вы хотите использовать, стал текущим контекстом. CGContextSaveGState (ctx) сохраняет контекст (указанный ctx), позже вы можете восстановить контекст, используя CGContextRestoreGState()