【问题标题】:Clipping shadows created by CALayer.shadowCALayer.shadow 创建的剪切阴影
【发布时间】:2012-03-19 18:17:45
【问题描述】:

我想在 HOLLOW CGPath 的 OUTSIDE 边缘周围添加一个阴影(这两个词很关键:outside +hollow :))。

Apple 的阴影实现只允许您进行“填充”阴影。

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

(我猜是 Apple 将其“隐藏”为一组魔法变量的不幸后果?)

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


更新:

我想出了如何剪辑以仅显示阴影的内部部分:将“layer.mask”设置为一个新图层,它是当前图层的克隆(即相同的路径),并设置路径填充颜色对于任何具有完整 alpha 的内容。

这与我正在尝试的相反,所以如果我能找到一种方法让遮罩层翻转 alpha(0 变为 1,1 变为 0),我会在那里......

【问题讨论】:

    标签: ios core-graphics calayer


    【解决方案1】:

    假设你有一个方法:

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

    ...然后这样做:

    1. 复制图层,创建“蒙版”
    2. 使用掩码 - 相同的 CGPath,记住 - 并将其路径替换为具有以下内容的路径:
      1. 整层的矩形
      2. 减去原始路径
      3. (使用EO规则实现)
    3. 将原始图层(有阴影的那个)的蒙版设置为新图层“蒙版”

    即在代码中:

    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;
    

    注意:这确实有效,只是与我没有遮罩时相比,阴影似乎放大了一点。哦,好吧。

    【讨论】:

    • 我试过这个,但我的层没有任何反应,而且你没有定义shadowBorderWidth。这是什么意思?
    • 我已经更改了代码。我不知道它是否仍然有效,可能会。如果它对您不起作用,您需要进行大量调试:您的 cloneShapeLayer 方法、您的 CGPath 中的缠绕规则、您的原始 CGPath 本身等等……这非常依赖于您的源代码和您的图像数据- 我无法为你调试。
    • 谢谢,我试试这个:)
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2015-01-12
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多