我想在HOLLOW CGPath的OUTSIDE边缘附近添加一个阴影(这两个词是关键的:外部+空心:))。
Apple的影子实现只允许你做“填充”阴影。
那么......如何剪掉阴影本身的内部?如果它是一个渲染调用,我会调用CGContextSetClip *方法将它剪辑到我想要的位置......但我看不出你是如何得到它的,因为它既不是渲染调用,也不是CALayer本身
(p)(苹果将“隐藏”为一组魔术变量的不幸后果,我猜?)注意:这只是iOS - 在Mac上的IIRC可以直接访问用于创建阴影的滤镜,因此您可以手动创建自己的(任意)阴影。
更新:
我研究了如何剪辑以仅显示阴影的INNER部分:设置“layer.mask”,成为当前图层的克隆(即相同路径)的新图层,并设置路径fillcolor任何有完整alpha的东西。
这与我正在尝试的相反,所以如果我能想办法让掩码层翻转alpha(0变为1,1变为0),我会在那里...
答案 0 :(得分:5)
假设你有一个方法:
-(CAShapeLayer*) cloneShapeLayer; // creates a new CAShapeLayer and copies the values
...然后这样做:
即。在代码中:
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;
注意:这实际上是有效的,除了与我没有掩饰时相比,阴影看起来有点扩大。哦,好吧。