Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 反转卷帘罩_Ios_Swift_Calayer_Mask - Fatal编程技术网

Ios 反转卷帘罩

Ios 反转卷帘罩,ios,swift,calayer,mask,Ios,Swift,Calayer,Mask,我试图使用一个带有图像的CALayer作为屏蔽UIView的内容。对于遮罩,我有复杂的png图像。如果我将图像应用为view.layer.mask,我会得到与我想要的相反的行为。 有没有办法把炉卷倒过来?这是我的密码: layerMask = CALayer() guard let layerMask = layerMask else { return } layerMask.contents = #imageLiteral(resourceName: "mask").cgImage v

我试图使用一个带有图像的CALayer作为屏蔽UIView的内容。对于遮罩,我有复杂的png图像。如果我将图像应用为view.layer.mask,我会得到与我想要的相反的行为。 有没有办法把炉卷倒过来?这是我的密码:

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. // <---
layerMask=CALayer()
guard let layerMask=layerMask else{return}
layerMask.contents=#imageLiteral(resourceName:“mask”).cgImage
view.layer.mask=图层掩码
//我想说的是

view.layer.mask=layerMask.inverse.// 我要做的是实时构建掩码。这是很容易的,如果你有一个标志的黑色图像。使用标准技术,您可以将徽标图像绘制成实时构建的图像,以便您负责图像的大小以及其中徽标的大小和位置。使用“遮罩到Alpha”CIFilter,可以将黑色转换为透明,用作层遮罩

所以,来举例说明。这是背景图像:这是我们希望看到的,无论我们在前景上打一个洞:

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

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

以下是用代码绘制成正确大小的白色背景的徽标:

最后,这是同一个图像,它被转换成一个带有“mask To Alpha CIFilter”的遮罩,并作为它的
遮罩连接到前景图像视图中:

好吧,我本可以选择好一点的图片,但这就是我所拥有的。你可以看到,无论标志上哪里有黑色,我们都会在前景图像上打一个洞,然后看到背景图像,我相信这正是你所说的你想要做的

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

问题是遮罩在关键点窗口的中心有一个固定的大小。如果我想在Photoshop中绘制“正确”的遮罩,我将永远无法使遮罩在所有屏幕尺寸上工作。所以我用我的公司标志作为遮罩,我需要从主视图中打印出来。不,我不明白。如果你从你的蒙版开始,为什么会起作用?如果你从正确的蒙版开始,为什么会不起作用?在Photoshop中反转你的蒙版。否则你可以在代码中反转它,但为什么你要在Photoshop上这样做呢?我已经在主postWell中添加了一个示例图像,我的答案告诉你如何做。如果你从黑色的三角形物体开始,你可以制作一个包含三角形物体的任意大小的图像,并将其转换成一个完全符合你要求的遮罩。是的,就是这样!非常感谢!我只需要让代码正常工作。当我开始工作时,我会把它贴出来。谢谢你的时间!关键部分是将黑白图像转换为透明遮罩,我可以肯定地告诉你这一点;等一下,好了。我已经为最后一步添加了代码,我想你可能不知道该怎么做。太好了!!就是这样:)我在C上发现了一个类似的东西..但很挣扎。再次感谢Mattdude,在这些变量命名中,您应该更具声明性