微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。