使用UIGraphicsPushContext(aContext)和UIGraphicsPopContext()

时间:2012-09-11 21:56:41

标签: objective-c cocoa-touch uikit cgcontextref

我在让主题电话工作时遇到问题。下面的测试应绘制两个橙色和一个绿色矩形。

以下是我对以下代码的理解......

  • 我画了一个50,50
  • 的橙色矩形
  • 我将绘制greenRect调用200,200,发送当前上下文
  • 我将当前上下文推到堆栈上,更改笔触颜色并在100,100
  • 处绘制绿色矩形
  • 我弹出当前上下文,该上下文应恢复原始上下文(橙色笔触颜色)
  • 然后我画出最后一个应该是橙色的矩形

最后一个矩形应该是橙色,但是是绿色,告诉我我修改了原始上下文

思想?

- (void)drawRect:(CGRect)rect{

CGRect aRectangle=CGRectMake(50., 50., 40., 40.);
UIBezierPath *path=[UIBezierPath bezierPathWithRect:aRectangle];
UIColor *strokeColor=[UIColor orangeColor];
[strokeColor setStroke];
[path stroke];

CGContextRef context=UIGraphicsGetCurrentContext();

[self drawGreenRect:context];

CGRect anotherRectangle=CGRectMake(100., 100., 40., 40.);
UIBezierPath *anotherPath=[UIBezierPath bezierPathWithRect:anotherRectangle];
[anotherPath stroke];

}

- (void)drawGreenRect:(CGContextRef)ctxt{

UIGraphicsPushContext(UIGraphicsGetCurrentContext());

CGRect aRectangle=CGRectMake(200., 200., 40., 40.);
UIBezierPath *path=[UIBezierPath bezierPathWithRect:aRectangle];
UIColor *strokeColor=[UIColor greenColor];
[strokeColor setStroke];
[path stroke];

 UIGraphicsPopContext();

}

1 个答案:

答案 0 :(得分:1)

UIGraphicsPushContext()不会为您创建新的上下文,它只会将您传递的上下文推送到堆栈上。所以在你执行UIGraphicsPushContext(UIGraphicsGetCurrentContext());之后,你有两个深度的图形上下文堆栈,但它上面的两个项目都是相同的上下文,是你的视图为你设置​​的上下文。

您需要实际创建要推送的上下文,最有可能使用UIGraphicsBeginImageContext()。然后,您可以从该上下文中获取图像并将其放入视图中。