Recorte de sombras creado por CALayer.shadow

Quiero agregar una sombra alnetworkingedor del borde EXTERIOR de un HOLLOW CGPath (esas dos palabras son críticas: fuera + hueco :)).

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

Entonces … ¿cómo recortar la parte interior de la sombra en sí misma? Si se tratara de una llamada renderizada, llamaría a los methods CGContextSetClip * para recortarla a donde quisiera … pero no veo cómo conseguirlo, ya que no es una llamada renderizada, ni un CALayer en sí .

(una consecuencia desafortunada de Apple "ocultarlo" como un set de variables mágicas, supongo?)

Nota: esto es solo iOS: IIRC en Mac tiene acceso directo a los filters utilizados para crear sombras, para que pueda crear sus propias sombras (arbitrarias) a mano.


ACTUALIZAR:

Descubrí cómo recortar para mostrar solo la parte INNER de la sombra: establece "layer.mask", para que sea una nueva capa que sea un clon de la capa actual (es decir, la misma ruta), y establece la ruta fillcolor a cualquier cosa con alfa completa

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

Suponiendo que tiene un método:

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

… luego haz esto:

  1. Copie la capa, creando "máscara"
  2. Tome la máscara, el mismo CGPath, recuerde, y reemplace su ruta con una ruta que tenga:
    1. El rectángulo de toda la capa
    2. MINUS la ruta original
    3. (logrado mediante el uso de la regla EO)
  3. configure la máscara de la capa original (la que tiene la sombra) para que sea la nueva capa "máscara"

es decir, en el 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.