反转CALayer面具

时间:2017-02-15 00:13:39

标签: ios swift calayer mask

enter image description here我正在尝试使用带有图像的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和Mutable路径上看到了几个帖子,但我无法反转CALayer。 我可以做的是在Photoshop中反转图像以便反转alpha,但问题是我将无法创建具有适合所有屏幕尺寸的确切大小的图像。我希望它确实有意义。

1 个答案:

答案 0 :(得分:7)

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

所以,来说明一下。这是背景图片:这是我们想要在前景中打孔的地方看到的:

enter image description here

这是前景图片,位于背景之上并完全隐藏它:

enter image description here

这是黑色的徽标(忽略灰色,代表透明度):

enter image description here

这是在代码中绘制的标识为正确大小的白色背景:

enter image description here

最后,这是相同的图像转换为Mask To Alpha CIFilter的掩码,并作为其mask附加到前景图像视图:

enter image description here

好吧,我本可以选择一些更好的图像,但这就是我躺在那里的东西。您可以看到,只要徽标中有黑色,我们就会在前景图像上打一个洞并看到背景图像,我相信这正是您所说的想要做的。

关键步骤是最后一步,即将徽标(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