Invierta una máscara CALayer

introduzca la descripción de la imagen aquí Estoy intentando usar un CALayer con una image como contenido para enmascarar una UIView. Para la máscara tengo una image png compleja. Si aplico la image como view.layer.mask, obtengo el comportamiento opuesto de lo que quiero. ¿Hay alguna forma de invertir el CAlayer? Aquí está mi código:

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. // <--- 

He visto varias publicaciones en CAShapeLayers y paths mutables en sentido inverso, pero nada en lo que puedo invertir un CALayer. Lo que pude hacer es invertir la image en Photoshop para que el alfa esté invertido, pero el problema es que no podré crear una image con el tamaño exacto para adaptarse a todos los tamaños de pantalla. Espero que tenga sentido.

Lo que haría es build la máscara en time real. Esto es fácil si tiene una image negra del logotipo. Usando técnicas estándar, puede dibujar la image del logotipo en una image que usted construya en time real, de modo que esté a cargo del tamaño de la image y del tamaño y la location del logotipo dentro de ella. Usando un "Mask To Alpha" CIFilter, puede convertir el negro a transparente para usar como máscara de capa.

Entonces para ilustrar Aquí está la image de background: esto es lo que queremos ver donde perforamos un agujero en primer plano:

introduzca la descripción de la imagen aquí

Aquí está la image de primer plano, situada sobre el background y completamente escondida:

introduzca la descripción de la imagen aquí

Aquí está el logotipo, en negro (ignore el gris, que representa la transparencia):

introduzca la descripción de la imagen aquí

Aquí está el logotipo dibujado en código en un background blanco del tamaño correcto:

introduzca la descripción de la imagen aquí

Y, por último, aquí está la misma image convertida en una máscara con la máscara a alfa CIFilter y adjunta a la vista de la image de primer plano como su mask :

introduzca la descripción de la imagen aquí

De acuerdo, podría haber elegido mis imágenes un poco mejor, pero esto es lo que tenía por ahí. Puedes ver que donde haya negro en el logotipo, estamos perforando un hoyo en la image de primer plano y viendo la image de background, que creo que es exactamente lo que dijiste que querías hacer.

El paso key es el último, a saber, la conversión de la image en negro sobre el logotipo ( im ) en una máscara; así es como lo hice:

  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