CAShapeLayer 作为具有相反预期效果的掩码

问题描述

请查看生成的图像 CAShapeLayer with path,with a mask over top

下面的红色是一个 UIBezierPath 然后被分配给一个 CAShapeLayer

drawingLayer.path = path.cgPath

这很好用。 然后我尝试将drawingLayer 的蒙版设置为另一条路径。遮罩层如下

        let maskLayer = CAShapeLayer()
        maskLayer.backgroundColor = UIColor.clear.cgColor
        maskLayer.linewidth = CGFloat(strokeSize) + 20
        maskLayer.strokeColor = UIColor.black.cgColor
        maskLayer.lineJoin = .round
        maskLayer.lineCap = .round
        maskLayer.isOpaque = false
        maskLayer.fillColor = nil

然后我设置遮罩层来遮罩drawingLayer

maskLayer.path = erasePath.cgPath
draingLayer.mask = maskPath

然而,它产生了上面的图像。我明白为什么会这样,但我不明白如何得到相反的结果。我知道,如果我将 maskLayer 的框架设置为画布的大小并将 maskLayer 的背景颜色设置为黑色,它实际上什么都不做。但如果我能以某种方式从 masklayers 背景中雕刻出擦除路径,那么我就可以得到我需要的东西。

有人知道如何制作我想要的面具吗? (如果不明显,遮罩层中的第二条路径需要擦除绘图层)。

我们已经尝试直接在 CGContext 上绘制图层并使用混合模式清除,但这只会擦除所有内容(其他图层/背景图像)。所以我们所做的是使用 UIGraphicsBeginImageContext(rect.size) 和 image = UIGraphicsGetimageFromCurrentimageContext() 然后简单地在 CGContext 上绘制结果图像。

这种方法效果很好,但会显着影响性能。仅使用其中的几层会减慢应用程序的速度。我们可以将图像的生成与绘制循环隔离以提高性能,但绘制图像本身仍然会影响性能。我们试图通过使用 CALayers 和 CAShapeLayers 来避免这种情况。但他们显然没有混合模式。如果我能让这个面具按照我需要的方式工作,就不会有性能下降。

任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)