2012-03-19 6 views
9

Quiero agregar una sombra alrededor del borde EXTERIOR de un CGPath HUECO (esas dos palabras son críticas: afuera + hueco :)).Sombreado de sombras creadas por CALayer.shadow

La implementación de la sombra de Apple solo le permite hacer sombras "llenas".

Entonces ... ¿cómo cortar la parte interior de la sombra? Si fuera una llamada de render, llamaría a los métodos CGContextSetClip * para que se recorten donde yo quisiera ... pero no veo cómo llegar, ya que no es una llamada de renderización, ni un CALayer en sí mismo. .

(una consecuencia desafortunada de Apple "ocultar" como un conjunto de variables de magia, supongo?)

NB: este es el IOS única - IIRC en Mac tiene acceso directo a los filtros utilizados para crear sombras , para que pueda crear sus propias sombras (arbitrarias) a mano.


ACTUALIZACIÓN:

trabajé encontrar la manera de clip para mostrar sólo la parte interior de la sombra: establecer el "layer.mask", al ser una capa nueva que es un clon de la capa actual (es decir, la misma ruta), y establece el camino fillcolor a cualquier cosa con alfa completo.

Esto es lo contrario de lo que estoy intentando, así que si pudiera encontrar una manera de hacer que la capa de máscara voltee alfa (0 se convierte en 1, 1 se convierte en 0), estaría allí ...

Respuesta

5

Asumiendo que tienen un método:

-(CAShapeLayer*) cloneShapeLayer; // creates a new CAShapeLayer and copies the values 

... entonces hacer esto:

  1. Copiar la capa, la creación de "máscara"
  2. máscara Take - CGPath misma, recuerda - y sustituir su Pensilvania th con un camino que tiene:
    1. El rect de toda la capa
    2. MENOS el camino original
    3. (logrado mediante el uso de la regla de EO)
  3. ajustar la máscara de la capa original (la uno con la sombra) para ser la nueva capa de "máscara"

es decir, en código:

CAShapeLayer* maskLayer = [originalLayer cloneShapeLayer]; 
// got to make it a bit bigger if your original path reaches to the edge 
// since the shadow needs to stretch "outside" the frame: 
CGFloat shadowBorder = 50.0; 
maskLayer.frame = CGRectInset(maskLayer.frame, - shadowBorder, - shadowBorder); 
    maskLayer.frame = CGRectOffset(maskLayer.frame, shadowBorder/2.0, shadowBorder/2.0); 
maskLayer.fillColor = [UIColor blackColor].CGColor; 
maskLayer.lineWidth = 0.0; 
maskLayer.fillRule = kCAFillRuleEvenOdd; 

CGMutablePathRef pathMasking = CGPathCreateMutable(); 
CGPathAddPath(pathMasking, NULL, [UIBezierPath bezierPathWithRect:maskLayer.frame].CGPath); 
CGAffineTransform catShiftBorder = CGAffineTransformMakeTranslation(shadowBorder/2.0, shadowBorder/2.0); 
CGPathAddPath(pathMasking, NULL, CGPathCreateCopyByTransformingPath(maskLayer.path, &catShiftBorder)); 
maskLayer.path = pathMasking; 

shapeLayer.mask = maskLayer; 

NB: esto realmente funciona, excepto que la sombra parece agrandarse un poco en comparación con cuando no estaba enmascarando. Oh bien.

+0

Intenté esto, pero no pasó nada a mi capa, y no definiste 'shadowBorderWidth'. ¿Qué significa? –

+0

He cambiado el código. No sé si funcionará, probablemente sí. Si no funciona para ti, tienes MUCHA depuraciones que hacer: tu método cloneShapeLayer, tu regla de enrollamiento en tu CGPath, tu CGPath original, etc ... esto depende mucho de TU código fuente y TUS datos de tu imagen - No puedo depurar eso por ti. – Adam

+0

Gracias, intentaré esto :) –

Cuestiones relacionadas