我一直在学习斯坦福大学的 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);
}