2017-02-15 4 views
3

enter image description here J'essaie d'utiliser un CALayer avec une image comme contenu pour masquer un UIView. Pour le masque, j'ai une image png complexe. Si j'applique l'image en tant que view.layer.mask, j'obtiens le comportement inverse de ce que je veux. Y a-t-il un moyen d'inverser CAlayer? Voici mon code:Inverser un masque 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. // <--- 

Je l'ai vu plusieurs messages sur CAShapeLayers inverses et les chemins mutables, mais rien où je peux renverser un CALayer. Ce que je peux faire est d'inverser l'image dans Photoshop afin que l'alpha soit inversé, mais le problème avec cela est que je ne serai pas capable de créer une image avec la taille exacte pour s'adapter à toutes les tailles d'écran. J'espère que cela a du sens.

+0

"J'espère que cela a du sens." Ce n'est pas le cas. L'implication est que vous avez dessiné votre image de masque "en arrière" en premier lieu. Eh bien, c'était idiot. Pourquoi ne pas dessiner l'image du masque correctement pour commencer? – matt

+0

Le problème avec cela est que le masque a une taille fixe au centre de la fenêtre de la clé. Si je devais dessiner le masque "correct" dans Photoshop, je n'obtiendrais jamais le masque pour fonctionner sur toutes les tailles d'écran. Donc, j'utilise le logo de mon entreprise comme masque, que j'ai besoin de dessiner à partir de la vue principale – arvidurs

+0

Non, je ne suis pas. Pourquoi cela fonctionnerait-il si vous commencez avec le masque _your_ mais ne fonctionne pas si vous commencez avec le masque _correct_? – matt

Répondre

5

Ce que je ferais est de construire le masque en temps réel. C'est facile si vous avez une image noire du logo. En utilisant des techniques standard, vous pouvez dessiner l'image du logo dans une image que vous construisez en temps réel, de sorte que vous êtes en charge de la taille de l'image et la taille et le placement du logo à l'intérieur. En utilisant un CIFilter "Mask To Alpha", vous pouvez convertir le noir en transparent pour l'utiliser comme masque de calque.

Donc, pour illustrer. Voici l'image de fond: c'est ce que nous voulons voir où nous percer un trou au premier plan:

enter image description here

est ici l'image de premier plan, située au-dessus de l'arrière-plan et en se cachant complètement:

enter image description here

Voici le logo, en noir (ignorer le gris, ce qui représente la transparence):

enter image description here

est ici le logo dessiné dans le code dans un fond blanc de la taille correcte:

enter image description here

Et enfin, voici la même image convertie en un masque avec le masque Alpha CIFilter et attaché à l'image de premier plan vue comme mask:

enter image description here

D'accord, je aurait pu choisir mes images un peu mieux, mais c'est ce que j'avais traîner. Vous pouvez voir que partout où il y avait du noir dans le logo, nous perçons un trou dans l'image de premier plan et voyons l'image de fond, qui je crois est exactement ce que vous avez dit que vous vouliez faire.

L'étape clé est la dernière, à savoir la conversion de l'image noir sur blanc du logo (im) en un masque; voici comment j'ai fait cela:

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

Oui c'est tout! Merci beaucoup! J'ai juste besoin de faire fonctionner le code. Je l'afficherai quand je l'aurai au travail. Merci pour votre temps! – arvidurs

+0

La partie clé est la conversion de l'image noir sur blanc en un masque de transparence, et je peux certainement vous donner cela; Attend une seconde. – matt

+0

Voilà. J'ai ajouté le code pour la dernière étape, qui est la partie que je suppose que vous ne savez pas comment faire. – matt