2012-03-19 58 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