ios - 使用 setNeedsDisplayInRect 仍然会删除底层内容

标签 ios drawing touch quartz-2d

我将 UIView 子类化并重写了 touchesBegan、touchesMoved、touchesEnded 和 drawRect 方法,以创建允许用户通过触摸屏幕进行绘图的应用程序。我正在使用 Quartz 2D 库来绘图。

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

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

我怀疑问题是由于混合模式引起的,但是我尝试了多种不同的混合模式,但似乎没有一个能解决问题。

如何绘制保留底层内容的路径?

最佳答案

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

如果你想分层,你要么需要将每个东西放在它自己的 CALayerUIView 中,要么你需要每次重绘任何重叠部分 drawRect: 被调用。

关于ios - 使用 setNeedsDisplayInRect 仍然会删除底层内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065919/

相关文章:

iphone - 只能旋转一次UIImageView

iphone - 如何圆化 UIImage 的边缘?

c++ - 粗细的画线变白,OpenCv iOS 问题

Java - 不透明颜色

iphone - 如何在viewDidAppear方法或viewDidLoad中请求JSON数据?

ios - iPhone6,6+ 未显示在 App Store 的兼容性部分

android - 如何在 Fragment 上使用 onDraw?

jquery - 阻止 jQuery 在触摸设备上运行 mouseenter

java - 你如何检测双击拖动?

linux - bash/linux - touch/mkdir 来自文件中的字符串