2017-10-21 78 views
1

Je souhaite appliquer un masque inversé à mon UIView. J'ai mis le masque à un UIImageView avec une image transparente. Cependant, la sortie avecMasque inversé UIView MaskView

view.mask = imageView 

n'est pas le résultat souhaité. Comment puis-je obtenir le résultat souhaité comme illustré ci-dessous? Le résultat souhaité utilise la découpe du masque comme transparence. Quand je vérifie le masque de la vue, ce n'est pas un CAShapeLayer donc je ne peux pas l'inverser de cette façon.

An illustration of what happens vs what I want.

+0

double possible de [masque inverti iOS drawRect] (https://stackoverflow.com/questions/14411765/ios-invert-mask-in-drawrect) – the4kman

Répondre

2

On dirait que vous pourriez faire quelques petites choses. Vous pouvez utiliser l'image que vous avez mais masquer une vue blanche et placer une vue bleue derrière elle. Vous pouvez également ajuster l'élément d'image que vous utilisez en inversant la transparence. Ou vous pouvez utiliser CoreImage pour le faire dans le code. Par exemple:

func invertMask(_ image: UIImage) -> UIImage? 
{ 
    guard let inputMaskImage = CIImage(image: image), 
     let backgroundImageFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.black]), 
     let inputColorFilter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: [kCIInputColorKey: CIColor.clear]), 
     let inputImage = inputColorFilter.outputImage, 
     let backgroundImage = backgroundImageFilter.outputImage, 
     let filter = CIFilter(name: "CIBlendWithAlphaMask", withInputParameters: [kCIInputImageKey: inputImage, kCIInputBackgroundImageKey: backgroundImage, kCIInputMaskImageKey: inputMaskImage]), 
     let filterOutput = filter.outputImage, 
     let outputImage = CIContext().createCGImage(filterOutput, from: inputMaskImage.extent) else { return nil } 
    let finalOutputImage = UIImage(cgImage: outputImage) 
    return finalOutputImage 
} 
+0

Incroyable! Le seul problème que j'ai est que l'imageView plus petit est que l'UIView donc le masque montre seulement l'image inversée avec la découpe. Comment puis-je résoudre ce problème? –

+1

Je suppose que la chose la plus simple est de mettre le 'frame' de' imageView' à la même taille que la vue masquée et de mettre le 'contentMode' de' imageView' à '.scaleAspectFill' mais c'est dur savoir exactement quoi faire. Peut-être pourriez-vous mettre à jour votre question avec ce que vous aimeriez qu'il se passe. – beyowulf