Cómo crear máscaras reversas en CALayers

Haré que esto sea lo más simple posible.

¿Cómo creo máscaras CALayers en CALayers en iOS?

Tengo una vista en rojo y una image que se utiliza para enmascarar la vista roja. introduzca la descripción de la imagen aquí

Utilizo la propiedad de máscara de CALayer la vista para aplicar la máscara, el resultado es el siguiente. introduzca la descripción de la imagen aquí

Sin embargo, lo que deseo sería el resultado opuesto, como (imagina que la parte blanca aquí es en realidad la madera en el background, porque no soy muy buena con el software de edición de imágenes) introduzca la descripción de la imagen aquí

En otras palabras: quiero que la image de enmascaramiento atraviese la vista y no actúe como una capa de enmascaramiento real. Las respuestas en C # (MonoTouch) u Obj-C están bien de cualquier manera.

Espero que sea útil

Paso 1: crea una máscara sin ningún canal alfa.

Paso 2: crea una máscara invertida siguiendo el método

 - (UIImage*)createInvertMask:(UIImage *)maskImage withTargetImage:(UIImage *) image { CGImageRef maskRef = maskImage.CGImage; CGBitmapInfo bitmapInfo = kCGImageAlphaNone; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGImageRef mask = CGImageCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGColorSpaceCreateDeviceGray(), bitmapInfo, CGImageGetDataProvider(maskRef), nil, NO, renderingIntent); CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); CGImageRelease(mask); CGImageRelease(maskRef); return [UIImage imageWithCGImage:masked]; } 

Paso 3: Establezca la máscara invertida en una UIView siguiendo el método

 - (void)maskWithImage:(UIImage*) maskImage TargetView:(UIView*) targetView { CALayer *_maskingLayer = [CALayer layer]; _maskingLayer.frame = targetView.bounds; [_maskingLayer setContents:(id)[maskImage CGImage]]; [targetView.layer setMask:_maskingLayer]; } 

Terminado.

¿Como llamar?

 UIImage* targetImage = [UIImage imageNamed:@"sky_bg.png"]; UIImage* mask = [UIImage imageNamed:@"mask01.png"]; UIImage* invertMask = [self createInvertMask:mask withTargetImage:targetImage]; [self maskWithImage:invertMask TargetView:targetview]; 

Necesita invertir el alfa de su máscara, por lo que los "agujeros" son los píxeles transparentes. También querrás estirar tu image para cubrir toda la vista roja.