1

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

另一方面,如果我在 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 还是像以前一样易变?文档不包含有关它的信息,并且一如既往地含糊不清。

谢谢

4

2 回答 2

1

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

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

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

在你的视图绘制的情况下,UIKit 为你设置上下文并调用你的drawRect:. 这里有一定的间接性——你从来没有真正“画到一个视图中”,总是在一个上下文中。您的视图本质上保留并代表屏幕的一部分。UIKit 会询问您想在该部分中添加什么,并为您提供图形上下文,以便您可以传达该信息。然后它获取充满指令的上下文,将其转换为像素数据,并在您的视图表示的区域中绘制它。

于 2011-06-12T04:16:42.500 回答
1

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

于 2011-06-12T02:55:33.357 回答