使用setNeedsDisplayInRect仍会删除基础内容

时间:2012-04-08 19:48:02

标签: ios drawing touch quartz-2d

我已经将UIView子类化并覆盖了touchesBegan,touchesMoved,touchesEnded和drawRect方法来创建一个允许用户通过触摸屏幕进行绘制的应用程序。我正在使用Quartz 2D库来绘制图纸。

在touchesBegan,touchesMoved和touchesEnded中,我会跟踪触摸事件的当前位置和之前位置。每次触摸移动和触摸结束时,我都会使用包含触摸的上一个和当前位置的最小矩形调用setNeedsDisplayInRect,以便保留底层绘图。 (我希望所有图纸像图层一样相互添加。)

我注意到一个奇怪的神器:当创建一个与另一个绘图重叠的绘图时,Quartz会重新绘制传递给setNeedsDisplayInRect的矩形,但会删除该矩形下面的所有内容。

我怀疑这个问题是由混合模式引起的,但是我尝试了许多不同的混合模式,但似乎都没有。但

如何绘制保留基础内容的路径?

1 个答案:

答案 0 :(得分:1)

Quartz不是画布模型。它不会跟踪先前循环中绘制的内容。每次调用drawRect:时,您都有责任处理传递的矩形中的每个像素。默认情况下(在UIView clearsContextBeforeDrawing中设置),Quartz会为您清除矩形,但每次绘制内容都是你的工作。

如果你想要分层,你需要将每个东西放在自己的CALayerUIView中,或者每次调用drawRect:时都需要重绘任何重叠。< / p>