反转一个CALayer掩码

在这里输入图像说明 我正在尝试使用CALayer与图像作为内容掩盖UIView。 对于面具,我有复杂的PNG图像。 如果我将这个图像作为view.layer.mask应用,我会得到我想要的相反的行为。 有没有办法改变CAlayer? 这是我的代码:

layerMask = CALayer() guard let layerMask = layerMask else { return } layerMask.contents = #imageLiteral(resourceName: "mask").cgImage view.layer.mask = layerMask // What I would like to to is view.layer.mask = layerMask.inverse. // <--- 

我已经看到反向CAShapeLayers和可变path上的几个职位,但没有什么地方可以扭转CALayer。 我所能做的就是在Photoshop中反转图像,以便alpha被倒转,但问题在于我无法创build具有适合所有屏幕大小的确切大小的图像。 我希望这是有道理的。

我会做的是实时构build面具。 如果您有徽标的黑色图像,这很容易。 使用标准技术,您可以将徽标图像绘制到您实时构build的图像中,以便您负责图像的大小以及徽标的大小和位置。 使用“Mask To Alpha”CIFilter,您可以将黑色转换为透明以用作图层蒙版。

所以说明一下。 这里是背景图片:这是我们希望看到的任何地方,我们在前台打洞的地方:

在这里输入图像说明

这是前景图像,躺在背景的顶部,并完全隐藏它:

在这里输入图像说明

这是黑色的标志(忽略表示透明度的灰色):

在这里输入图像说明

这里的代码绘制成正确的大小的白色背景的标志:

在这里输入图像说明

最后,将同一图像转换为Mask To Alpha CIFilter的遮罩,并将其作为mask附加到前景图像视图中:

在这里输入图像说明

好吧,我可以select我的图像好一点,但这是我躺在这里。 你可以看到,在标志中有黑色的地方,我们正在前景图像上打出一个洞,看到背景图像,我相信这正是你所说的你想要做的。

关键步骤是最后一步,即将标志( im )的黑白图像转换为蒙版; 这是我如何做到这一点:

  let cim = CIImage(image:im) let filter = CIFilter(name:"CIMaskToAlpha")! filter.setValue(cim, forKey: "inputImage") let out = filter.outputImage! let cgim = CIContext().createCGImage(out, from: out.extent) let lay = CALayer() lay.frame = self.iv.bounds lay.contents = cgim self.iv.layer.mask = lay