剪切CALayer.shadow创建的阴影

时间:2012-03-19 18:17:46

标签: ios core-graphics calayer

我想在HOLLOW CGPath的OUTSIDE边缘附近添加一个阴影(这两个词是关键的:外部+空心:))。

Apple的影子实现只允许你做“填充”阴影。

那么......如何剪掉阴影本身的内部?如果它是一个渲染调用,我会调用CGContextSetClip *方法将它剪辑到我想要的位置......但我看不出你是如何得到它的,因为它既不是渲染调用,也不是CALayer本身

(p)(苹果将“隐藏”为一组魔术变量的不幸后果,我猜?)

注意:这只是iOS - 在Mac上的IIRC可以直接访问用于创建阴影的滤镜,因此您可以手动创建自己的(任意)阴影。


更新:

我研究了如何剪辑以仅显示阴影的INNER部分:设置“layer.mask”,成为当前图层的克隆(即相同路径)的新图层,并设置路径fillcolor任何有完整alpha的东西。

这与我正在尝试的相反,所以如果我能想办法让掩码层翻转alpha(0变为1,1变为0),我会在那里...

1 个答案:

答案 0 :(得分:5)

假设你有一个方法:

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

...然后这样做:

  1. 复制图层,创建"蒙版"
  2. 采取掩码 - 相同的CGPath,记住 - 并用以下路径替换其路径:
    1. 整个图层的矩形
    2. 减去原始路径
    3. (通过使用EO规则实现)
  3. 将原始图层(带阴影的图层)的蒙版设置为新图层"蒙版"
  4. 即。在代码中:

    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;
    

    注意:这实际上是有效的,除了与我没有掩饰时相比,阴影看起来有点扩大。哦,好吧。