2011-12-13 43 views
6

我有一個CALayers的集合。每個圖層都是同一父級CALayer的子圖層,並且每個圖層都應用了一個陰影。這些圖層是動態定位的,並且有很多圖層,所以我無法預測它們將如何提前安排。有沒有辦法防止重疊相鄰圖層的CALayer陰影?

如果圖層彼此相鄰(足夠接近以至於幾乎觸摸),則其中一個CALayers的陰影會呈現在另一個CALayer之上。這在大多數情況下可能是預期的效果,但我希望我的圖層存在於同一個z平面中。 (這是一個例子,CSS3陰影應用於網頁設計中的塊元素。)

這可能嗎?我怎樣才能做到這一點?

(我有這個想法:使用我自己的陰影圖像爲每個CALayer添加一個'陰影'子圖層,並將z位置設置爲較低的值但層疊樹不會使這成爲不可能的嗎?Z-在一個圖層座標系中的位置與另一圖層座標系中的z位置無關,對嗎?)

回答

16

如果所有陰影圖層都具有相同的陰影設置,請將它們放入容器圖層並將陰影設置在容器上層。例如:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CALayer *containerLayer = [CALayer layer]; 
    containerLayer.frame = self.view.bounds; 
    containerLayer.shadowRadius = 10; 
    containerLayer.shadowOpacity = 1; 
    [self.view.layer addSublayer:containerLayer]; 

    CAShapeLayer *layer1 = [CAShapeLayer layer]; 
    layer1.bounds = CGRectMake(0, 0, 200, 200); 
    layer1.position = CGPointMake(130, 130); 
    layer1.path = [UIBezierPath bezierPathWithOvalInRect:layer1.bounds].CGPath; 
    layer1.fillColor = [UIColor redColor].CGColor; 
    [containerLayer addSublayer:layer1]; 

    CAShapeLayer *layer2 = [CAShapeLayer layer]; 
    layer2.bounds = CGRectMake(0, 0, 200, 200); 
    layer2.position = CGPointMake(170, 200); 
    layer2.path = [UIBezierPath bezierPathWithOvalInRect:layer2.bounds].CGPath; 
    layer2.fillColor = [UIColor blueColor].CGColor; 
    [containerLayer addSublayer:layer2]; 
} 

輸出:

overlapping circles with unified shadow

+0

哇,謝謝!事後看來這很明顯。這個想法確實發生在我身上,但我認爲它會對容器層的形狀施加陰影(不管是什麼,哈哈)。 –

+1

+1優秀的答案 – occulus

相關問題