Использование UIGraphicsPushContext (context) и UIGraphicsPopContext () - PullRequest
3 голосов
/ 06 февраля 2012

Очень разочаровывающий опыт понимания UIGraphicsPushContext (context) и UIGraphicsPopContext ()

Насколько я понимаю, я могу установить атрибуты контекста, такие как цвет обводки, а затем поместить контекст в стек, чтобы я мог установить новый цвет для текущего контекста. Когда я это сделаю, я могу вернуться к контексту, щелкнув по нему.

Ниже мой код. Когда я запускаю код ниже, две линии нарисованы синим цветом. Что я ожидаю, так это то, что я сначала установил зеленый цвет. Перейдите к функции blueLine и нажмите зеленый контекст. Нарисуйте синим цветом. Тогда поп зеленый контекст. Разрешение функции drawLine рисовать зеленым цветом.

Вот скриншот того, что нарисовано (две синие линии): http://dl.dropbox.com/u/1207310/iOS%20Simulator%20Screen%20shot%20Feb%205%2C%202012%209.00.35%20PM.png

Любая помощь приветствуется! Спасибо.

- (void)drawBlueLine:(CGContextRef)context
{
    UIGraphicsPushContext(context);
    [[UIColor blueColor] setStroke];
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, self.bounds.origin.x, 100);
    CGContextAddLineToPoint(context, self.bounds.origin.x+self.bounds.size.width, 200);
    CGContextStrokePath(context); 
    UIGraphicsPopContext();
}

- (void)drawLine:(CGContextRef)context
{
    UIGraphicsPushContext(context);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, self.bounds.origin.x, 200);
    CGContextAddLineToPoint(context, self.bounds.origin.x+self.bounds.size.width, 300);
    CGContextStrokePath(context); 
    UIGraphicsPopContext();
}

- (void)drawRect:(CGRect)rect
{   
    CGContextRef context = UIGraphicsGetCurrentContext();

    [[UIColor redColor] setStroke];
    CGContextSetLineWidth(context, 5.0);
    [self drawBlueLine:context];
    [self drawLine:context];
}

Или это не должно работать?

- (void)drawLine:(CGContextRef)oldContext
{

    UIGraphicsPushContext(oldContext); //makes oldContext the current context but there is a copy on the stack
    [[UIColor blueColor] setStroke];
    CGContextBeginPath(oldContext);
    CGContextMoveToPoint(oldContext, self.bounds.origin.x, 200);
    CGContextAddLineToPoint(oldContext, self.bounds.origin.x+self.bounds.size.width, 300);
    CGContextStrokePath(oldContext); 

    UIGraphicsPopContext(); //previous oldContext is moved back into place containing red?
}

- (void)drawRect:(CGRect)rect
{ 

    CGContextRef oldContext = UIGraphicsGetCurrentContext();

    [[UIColor redColor] setStroke];
    [self drawLine:oldContext];
    //anything I draw here should be red.  Shouldn't it?`

Ответы [ 2 ]

6 голосов
/ 06 февраля 2012

Что UIGraphicsPushContext и UIGraphicsPopContext делает, чтобы изменить, какой контекст используется для рисования, не обязательно сохранять и восстанавливать любое состояние данного контекста. То, что делает ваш код, - это просто повторяющая замена контекста, который был текущим до вызова drawRect:, на контекст, который вы захватываете с UIGraphicsGetCurrentContext (они, вероятно, в любом случае будут одинаковыми).

Если вы хотите сохранить состояние заданного контекста, используйте CGContextSaveGState и CGContextRestoreGState.

0 голосов
/ 29 марта 2012

Проблема в том, как вы устанавливаете цвет, вам нужно использовать

CGContextSetStrokeColorWithColor (контекст, цвет)

как это:

CGContextSetStrokeColorWithColor (контекст, [UIColor blueColor] .CGColor)

и

CGContextSetStrokeColorWithColor (контекст, [UIColor redColor] .CGColor)

так, чтобы цвет был связан с контекстом.

[[UIColor redColor] setStroke];

меняет цвет для всех штрихов ... Мне любопытно, если бы он переопределял вышеуказанную функцию, если бы она была установлена ​​для контекста, я думаю, что не будет ...

...