2012-03-07 20 views
12

Parece que tengo dificultades para agregar una máscara a través de CALayers. Simplemente estoy tratando de enmascarar un UIImageView. Aquí está mi código: (? Es de esta manera correcta para enmascarar)Agregar una máscara con CALayers

CALayer *maskLayer = [CALayer layer]; 
UIImage *mask = [UIImage imageNamed:@"mask.png"]; 
maskLayer.contents = mask; 

UIImageView *viewToMask = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 
viewToMask.image = [UIImage imageNamed:@"picture.png"]; 
viewToMask.layer.mask = maskLayer; 
[self.view addSubview:viewToMask]; 

mask.png es negro con un círculo transparente perforado a través de él. No estoy seguro de dónde está fallando, tal vez en maskLayer.contents, ya que se supone que es un CGImageRef, pero recibo errores cuando lo configuro como mask.CGImage, o a través de una variable local CGImageRef = mask.CGImage. De todos modos, la forma en que su conjunto ahora no da errores, así que espero que esté bien.

¿Alguien sabe lo que está pasando, o cómo configurar correctamente las máscaras con CALayers? Gracias

Respuesta

19

Trate

maskLayer.contents = (id)mask.CGImage; 

Sí, el elenco chupa, pero es necesario.


creo que también tendrá que decir

maskLayer.bounds = (CGRect){CGPointZero, mask.size}; 
+0

Hey, gracias por su ayuda en la pregunta original, estaba tratando de seguir con sus sugerencias. De todos modos, eso tampoco parece ser el truco. No veo ninguna máscara ni mi viewToMask para ese asunto. – user339946

+0

@ user339946: Probablemente necesites definir los 'bounds' de' maskLayer'. –

+1

Frame funcionó para mí, los límites no. –

13

probar esto:

CALayer *maskLayer = [CALayer layer]; 
UIImage *mask = [UIImage imageNamed:@"mask.png"]; 
maskLayer.contents = (id)mask.CGImage; 
// maskLayer.contentsGravity = kCAGravityCenter; 
maskLayer.frame = CGRectMake(0.0, 0.0,1024,768); 

UIImageView *viewToMask = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)]; 
viewToMask.image = [UIImage imageNamed:@"picture.png"]; 
viewToMask.layer.mask = maskLayer; 
[self.view addSubview:viewToMask]; 

también es necesario establecer armazón de la mascarilla

Cuestiones relacionadas