我正在尝试使用一个CALayer,其中包含一个图像作为遮盖UIView的内容。对于这个遮罩,我有一个复杂的png图像。如果我将这个图像作为一个视图.层.遮罩来应用,我会得到与我想要的相反的行为。有没有一种方法可以反转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和可变路径的文章,但是没有一篇是关于反转CALayer的。我能做的就是在Photoshop中反转图像,这样alpha就被反转了,但是问题是我不能创建一个大小完全适合所有屏幕大小的图像。我希望这是有意义的。
2条答案
按热度按时间gudnpqoy1#
我所要做的是真实的构造蒙版。如果你有一个黑色的徽标图像,这就很容易了。使用标准技术,你可以将徽标图像绘制成一个实时构造的图像,这样你就可以控制图像的大小以及徽标在图像中的大小和位置。使用“Mask To Alpha”CIFilter,然后你可以把黑色转换成透明的,用作图层蒙版。
为了说明,这是背景图片:这就是我们希望看到的,无论我们在前景上打了一个洞。
下面是前景图像,位于背景之上并将其完全隐藏:
下面是黑色的徽标(忽略代表透明的灰色):
下面是用代码绘制到正确大小的白色背景中的徽标:
最后,下面是使用“遮罩到Alpha CIFilter”转换为遮罩并附加到前景图像视图作为其
mask
的同一图像:好吧,我可以选择我的图像更好一点,但这是我躺在周围。你可以看到,无论哪里有黑色的标志,我们正在打一个洞的前景图像和看到的背景图像,我相信这正是你说你想做的。
关键步骤是最后一步,即将徽标的白色图像(
im
)转换为掩模;我是这样做:yuvru6vn2#
如果使用
CALayer
作为另一个CALayer
的蒙版,则可以通过创建一个大的不透明图层并使用xor
混合模式减去蒙版形状来反转蒙版。例如,此代码从较大的不透明图层中减去给定图层以创建遮罩图层:
然后你可以用这个图层作为其他
CALayer
的mask
,例如这里我用它作为一个蓝色小矩形的遮罩:所以你可以看到掩码是反转的!另一方面,如果你直接使用未反转的
maskLayer
作为mask
,你可以看到掩码没有反转: