iPhone - 尝试在CGContext中理解UIBezier

时间:2011-06-12 02:53:07

标签: iphone quartz-graphics uibezierpath

当我有一个UIBezier并且我在使用drawRect的视图上使用它时,我看到bezier是一种易变的,我的意思是,它实际上并没有在任何地方绘制。相反,它就像是在一种缓冲区中编写的,与我在该视图中看到的相对应。我的意思是,如果我使用[self setNeedsDisplay]再次调用drawRect,bezier就会消失,我可以写其他内容。

另一方面,如果我使用

在CGContext上绘制相似内容
CGContextStrokePath(ctx);

我真的把这一行写到了那个上下文中,并且没有办法删除它,如果我再次调用相同的方法,它将覆盖现在已经绘制了一行的上下文。

但是当我使用UIBezier命令在CGContext上写时会发生什么?

我的意思是,如果我做了类似

的事情
UIGraphicsPushContext(ctx);
CGContextSaveGState(ctx);
CGContextTranslateCTM(ctx, 0, height);
CGContextScaleCTM(ctx, 1.0, -1.0);
[myBezier stroke];
CGContextRestoreGState(ctx);
UIGraphicsPopContext();

这行是永久写入ctx还是像以前一样易变?文档中没有任何关于它的信息,并且一如既往地含糊不清。

感谢

2 个答案:

答案 0 :(得分:1)

UIBezierPath是一个包含一系列线条/曲线以及如何绘制它们的说明的类。当您绘制贝塞尔曲线路径时,它基本上与Quartz中的任何其他绘图函数完全相同。上下文的内容将持续上下文的生命周期(对于位图上下文,这是内存中位图的生命周期;对于视图上下文,“直到需要重新绘制视图。”

答案 1 :(得分:1)

每当你的视图drawRect:被调用时,UIKit就会设置一个图形上下文供你绘制。这就是为什么看起来bezier路径不是永久性的;每次需要显示视图时,都会有一个全新的上下文,并且您的路径会被吸引到该视图中。因此,每次通过drawRect:,您都可以决定不绘制特定路径,也不会显示。

一旦将路径添加到上下文中,就无法移除路径,但下次刷新视图时,会出现一个几乎没有任何内容的新上下文。如果你创建了自己的图形上下文,那么无论你输入什么都是“永久的” - 它将存在于上下文的生命周期中。

上下文基本上包括将产生“图片”的绘图指令。这是模糊的,因为上下文的目的地 - 图片将被绘制 - 可以是不同的东西:图像文件,设备屏幕的一部分,甚至可能是一张纸。上下文一旦充满绘图指令,就会被渲染到目的地。

如果是您的视图,UIKit会为您设置该上下文并调用您的drawRect:。这里有一定程度的间接 - 你从来没有真正“画入视图”,总是进入一个上下文。您的视图基本上保留并代表屏幕的一部分。 UIKit会询问您要在该部分中添加的内容,并为您提供图形上下文,以便您可以传达该信息。然后它需要上下文,其中包含指令,将其转换为像素数据,并在视图所代表的区域中绘制。