2010-02-15 12 views
10

Estoy creando un interruptor de activación/desactivación personalizado para el iPhone (similar al interruptor estándar) y estoy en el punto donde estoy configurando la máscara del control deslizante, pero llamando al [[myView layer] setMask:maskLayer] establece la posición de la capa de máscara relativa a la capa que enmascara, no relativa a la capa de contenedor de la capa de máscara. Para este escenario en particular, la posición de la capa de máscara debe establecerse en relación con su capa contenedora, ya que el control deslizante se moverá debajo de la máscara y la máscara permanecerá estacionaria.Enmascaramiento de un CALayer - iPhone

Sin tener que animar la máscara Y el componente deslizante de alternar para lograr el efecto deseado, ¿alguien sabe cómo hacerlo funcionar? Aquí es lo que tengo hasta ahora:

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
CGMutablePathRef path = CGPathCreateMutable(); 

CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, 13, 13)); 
CGPathAddEllipseInRect(path, nil, CGRectMake(30, 0, 13, 13)); 
CGPathAddRect(path, nil, CGRectMake(6, 0, 32, 13)); 

[maskLayer setPath:path]; 
[maskLayer setFillColor:[[UIColor greenColor] CGColor]]; 

[[self layer] addSublayer:maskLayer]; 

[maskLayer setPosition:CGPointMake(2, 2)]; 

[self addSubview:toggleView]; 

[[toggleView layer] setMask:maskLayer]; 
+0

Si este código no usa ARC, 'path' está goteando. – titaniumdecoy

Respuesta

14

Una máscara es sólo un tipo especial de subcapa, por lo que el superlayer de la máscara siempre habrá la capa que está enmascarando. No hay manera de evitarlo. Además, está infringiendo esta advertencia en la documentación:

Al configurar la máscara en una nueva capa, el superlayer de la nueva capa primero debe establecerse en cero, de lo contrario el comportamiento no está definido.

Debe eliminar la línea [[self layer] addSublayer:maskLayer];.

Para resolver su problema, crearía otra capa o vista que contenga todo lo que está ahora en su toggleView y luego agregue esa capa a su toggleLayer como una subcapa. De esta forma, puedes colocar la nueva subcapa independientemente de la máscara y si mueves la capa principal, tanto la máscara como la subcapa se moverán juntas (que es lo que deberían hacer si te entiendo correctamente).

+0

Genial, creo que veo lo que dices, y tiene más sentido hacerlo de esa manera. ¡Gracias! – jtrim

+4

¡Acabo de implementar esta solución y funciona muy bien! :: http://gist.github.com/306792 – jtrim

Cuestiones relacionadas