2017-02-15 34 views
3

enter image description here我试图使用的CALayer与图像作为掩蔽一个UIView的内容。对于面具我有复杂的PNG图像。如果我将该图像作为view.layer.mask应用,我会得到与我想要的相反的行为。 有没有办法改变CAlayer?这里是我的代码:逆转的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中的图像,使阿尔法倒置,但问题是,我将无法创建具有适合所有屏幕尺寸的确切大小的图像。我希望它确实有道理。

+0

“我希望它确实有道理。”它没有。其含义是,你首先将你的面具图像“倒退”。那很愚蠢。为什么不正确地绘制掩模图像开始? – matt

+0

问题在于掩码在关键窗口的中心有一个固定的大小。如果我在Photoshop中绘制“正确”蒙版,我将永远无法使蒙版适用于所有屏幕尺寸。所以我用我的公司标志作为面具,我需要从主视图上模版出 – arvidurs

+0

不,我不遵循。如果你以_your_ mask开始,那么为什么会这样工作,但如果你用_correct_ mask开始工作,那么为什么会这样呢? – matt

回答

5

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

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

enter image description here

这里的前景图像,趴在背景上,完全隐藏它:

enter image description here

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

enter image description here

这里的代码被拉入正确大小的白色背景上的标志:

enter image description here

最后,这里是相同的图像转换成与面膜阿尔法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 
+0

是的,它!非常感谢!我只需要让代码工作。将它发布后,它会发布它。谢谢你的时间! – arvidurs

+0

关键部分是将黑白图像转换为透明蒙版,我当然可以给你这个;等一会儿吧。 – matt

+0

你走了。我已经添加了最后一步的代码,这是我认为你可能不知道该怎么做的部分。 – matt