0

我一直在学习斯坦福大学的 IOS 课程,但我一直在理解 UIGraphicsPushContext 和 UIGraphicsPopContext 的作用(第 4 课)。从注释中可以看出,这些方法可用于避免其他实用程序方法影响当前图形状态。以下是注释中提供的示例:

- (void)drawGreenCircle:(CGContextRef)ctxt {

    UIGraphicsPushContext(ctxt);

    [[UIColor greenColor] setFill];

    // draw my circle 
    UIGraphicsPopContext();
}

- (void)drawRect:(CGRect)aRect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor redColor] setFill];

    // do some stuff
    [self drawGreenCircle:context];

    // do more stuff and expect fill color to be red
}

但是,当我尝试对此进行测试时,我似乎没有得到这个结果。下面是一个简单的测试用例,它在 drawRect 中获取当前上下文,设置颜色,调用将颜色设置为绿色的实用方法,返回到 drawRect 并绘制一条线。根据斯坦福网站上的注释,我预计该行将是红色的,因为我在 drawGreenCircle 中推送/弹出了上下文。(我意识到我实际上并没有在 drawGreenCircle 中绘制任何圆)但是我在 drawRect 中得到了一条绿线。看来我的 drawGreenCircle 方法确实改变了颜色并且没有将其恢复为红色。我想知道我对这个概念缺少什么。

- (void)drawGreenCircle:(CGContextRef)ctxt {
    //Doesn't actually draw circle --Just testing if the color reverts
    //to red in drawRect after this returns
    UIGraphicsPushContext(ctxt);
    [[UIColor greenColor] setStroke];   
    UIGraphicsPopContext();
}


- (void)drawRect:(CGRect)aRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor redColor] setStroke];
    // do some stuff
    [self drawGreenCircle:context];
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 500, 100);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
}
4

1 回答 1

2

你需要CGContextSaveGStateCGContextRestoreGState而不是。以下代码有效:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor greenColor] setFill];
    [[UIColor blackColor] setStroke];
    [self drawBlueCircle:context];
    CGContextMoveToPoint(context, 55, 5);
    CGContextAddLineToPoint(context, 105, 100);
    CGContextAddLineToPoint(context, 5, 100);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
}

- (void)drawBlueCircle:(CGContextRef)context {
    CGContextSaveGState(context);
    [[UIColor blueColor] setFill];
    CGContextAddEllipseInRect(context, CGRectMake(0, 0, 100, 100));
    CGContextDrawPath(context, kCGPathFillStroke);
    CGContextRestoreGState(context);
}

资源

于 2012-09-05T13:28:44.693 回答