CAShapelayer 绘图的橡皮擦功能:SWIFT

Posted

技术标签:

【中文标题】CAShapelayer 绘图的橡皮擦功能:SWIFT【英文标题】:Eraser functionality for CAShapelayer drawings : SWIFT 【发布时间】:2018-07-30 17:04:13 【问题描述】:

我正在开发绘图应用程序。我想实现擦除使用 UIBezierPath 绘制的路径的橡皮擦功能。这可能吗??

我试过下面的代码,但它不起作用

    UIGraphicsBeginImageContextWithOptions(self.tempImageView.frame.size, false, 0.0)
    if let context = UIGraphicsGetCurrentContext()
    
        tempImageView.image?.draw(in: CGRect(x:
            0, y: 0, width: self.tempImageView.frame.size.width, height: self.tempImageView.frame.size.height))
        let sublayer = CAShapeLayer()
        self.tempImageView.layer.addSublayer(sublayer)
        context.setBlendMode(CGBlendMode.clear)
        sublayer.strokeColor = editorPanelView.drawingColor.cgColor
        sublayer.lineJoin = kCALineJoinRound
        sublayer.lineCap = kCALineCapRound
        sublayer.lineWidth = editorPanelView.brushWidth
        let path = UIBezierPath()
        path.move(to: CGPoint(x: mid1.x, y: mid1.y))
        path.addQuadCurve(to:CGPoint(x:mid2.x, y:mid2.y) , controlPoint: CGPoint(x: prevPoint1.x, y: prevPoint1.y))
        sublayer.path = path.cgPath
        layerArray.append(sublayer)
        UIGraphicsEndImageContext()
    

我无法找到任何解决方案。任何帮助(即使只是朝着正确的方向发展)将不胜感激。

【问题讨论】:

【参考方案1】:

CAShapeLayer 是矢量图。是形状。通常的橡皮擦工具适用于光栅(基于像素)绘图。两者是不同的,并且没有一种直接的方法可以在矢量图上使用橡皮擦工具。

您可以做到这一点的一种方法是让橡皮擦工具编辑应用于您的形状图层的蒙版图层。它将具有擦除蒙版不透明的形状图层部分的效果。

其中一个棘手的部分是,一旦您绘制到蒙版中,您必须擦除该部分蒙版,以便用户能够将新内容绘制到已擦除区域中,这可能使旧绘图的已擦除部分显示出来。

把你想做的事情做好会很棘手。

【讨论】:

您介意使用您在此答案中描述的“掩码”方法查看我对橡皮擦的尝试,并让我知道我做错了什么吗?我只想让橡皮擦部分工作,然后我可以弄清楚如何“擦除”“擦除”部分以再次绘制它。任何帮助都会很棒:***.com/questions/57381552/…

以上是关于CAShapelayer 绘图的橡皮擦功能:SWIFT的主要内容,如果未能解决你的问题,请参考以下文章

iOS 绘图-UIBezierPath

如何撤消 HTML5 Canvas 绘图应用程序的橡皮擦操作

iOS“擦除”绘图与 CAShapeLayer 动画

使用HTML5和Javascript设计绘图程序

canvas画板绘图 矩形 圆形 椭圆 自定义多边形 画笔/铅笔 曲线 橡皮擦

js实现画布绘图橡皮擦除刮刮卡效果