2012-03-19 42 views
9

我想在HOLLOW CGPath的OUTSIDE边缘添加一个阴影(这两个词很重要:outside + hollow :))。CALayer.shadow创建的剪切阴影

苹果的影子执行只允许你做“填充”的阴影。

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

(苹果的一个不幸后果“藏”作为一组神奇的变量,我猜?)

注意:这是仅适用于iOS - IIRC在Mac上,你必须用来创建阴影过滤器直接访问,所以你可以手工创建你自己的(任意的)阴影。


UPDATE:

我制定了如何剪辑,只显示阴影的内侧部分:设置“layer.mask”,是一个新的层是当前层的一个副本(即相同的路径),并将路径fillcolor设置为具有完整字母的任何东西。

这是我想要的相反,所以如果我能想出一个方法来获得掩膜层翻转阿尔法(0变成1,1变成0),我会在那里...

回答

5

假设你有一个方法:

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

...那么这样做:

  1. 复制一层,打造 “面具”
  2. 采取面具 - 同CGPath,记住 - 并替换其PA与具有路径TH:
    1. 整个层
    2. MINUS原始路径
    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; 

注意:这实际上是有效的,只是与我没有掩蔽时相比,阴影似乎会变大一点。好吧。

+0

我试过了,但没有发生在我的图层上,而且你没有定义'shadowBorderWidth'。这是什么意思? – 2013-06-28 07:45:34

+0

我改变了代码。我不知道它是否仍然有效,可能会。如果它不适合你,你可以做很多调试:你的cloneShapeLayer方法,CGPath中的缠绕规则,你原来的CGPath本身等等......这取决于你的源代码和你的图像数据 - 我无法为你调试。 – Adam 2013-06-28 11:23:11

+0

谢谢,我会试试:) – 2013-06-28 14:53:37