我一直在到处寻找一个被问过很多次的问题的答案。我花了几个小时浏览 SO 和 Google。必须有一个不需要费力搬山的答案。
我正在开发矢量绘图应用程序,最终使绘图和撤消功能正常工作。现在我需要一个橡皮擦:-o
编辑:根据@DonMag 的精彩文章,我能够非常接近橡皮擦,但仍然有些不对劲。因此,我将尝试解释我的视图和图层在应用程序中的位置以及我这样做的原因:
从底部视图/层开始到顶部......
BackgroundImageView - 我使用这个图像视图来保存绘图表面的“背景”。它是一个可以更改的层,可以保存和调用新的“模板”。我把它分开,这样用户就不能擦除绘图表面。背景由 CAShapeLayers 组成,用于表示不同的纸张类型。
MainImageView - 我使用这个图像视图来完成用户启动的所有绘图。所以我触摸并拖动我的手指,新的 CAShapeLayer 被添加到图像视图中。这使用户的绘图与“绘图表面”分开。这也是我希望擦除发生的地方
PageImagesView - 我使用这个视图来保存用户可以添加到页面的图像,并移动/调整它们的大小。我不希望橡皮擦影响图像,但是如果 MainImageView 中绘制的一条线穿过图像并需要擦除,它应该让图像显示出来,而不是删除图像的某些部分。
我还添加了另一个图层,试图让橡皮擦工作,并将其称为“EraserImageView”,并将“蒙版”绘制到其中,然后尝试将该蒙版应用于 MainImageView。
这是我的绘图代码,每次调用 touchesMoved 时都会调用:
编辑: 将橡皮擦代码添加到我的绘图代码中。
if eraser {
let linePath = UIBezierPath()
for (index, point) in line.enumerated() {
if index == 0 {
midPoint = CGPoint(
x: (point.x + point.x) / 2,
y: (point.y + point.y) / 2
)
linePath.move(to: midPoint!)
} else {
midPoint = CGPoint(
x: (point.x + line[index - 1].x) / …Run Code Online (Sandbox Code Playgroud)