我正在尝试使用带有图像的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,但问题是我将无法创建具有适合所有屏幕尺寸的确切大小的图像。我希望它确实有意义。
答案 0 :(得分:7)
我要做的是实时构建面具。如果您有徽标的黑色图像,这很容易。使用标准技术,您可以将徽标图像绘制为实时构建的图像,以便您负责图像的大小以及图标的大小和位置。使用“Mask To Alpha”CIFilter,您可以将黑色转换为透明,以用作图层蒙版。
所以,来说明一下。这是背景图片:这是我们想要在前景中打孔的地方看到的:
这是前景图片,位于背景之上并完全隐藏它:
这是黑色的徽标(忽略灰色,代表透明度):
这是在代码中绘制的标识为正确大小的白色背景:
最后,这是相同的图像转换为Mask To Alpha CIFilter的掩码,并作为其mask
附加到前景图像视图:
好吧,我本可以选择一些更好的图像,但这就是我躺在那里的东西。您可以看到,只要徽标中有黑色,我们就会在前景图像上打一个洞并看到背景图像,我相信这正是您所说的想要做的。
关键步骤是最后一步,即将徽标(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