2011-12-13 8 views
6

私はCALayersのコレクションを持っています。各レイヤーは同じ親のサブレイヤで、CALayerであり、それぞれに影が適用されています。レイヤーは動的に配置されており、それらのレイヤーが多数あるため、事前にどのように配置するのか予測できません。CALayerの影が隣接するレイヤーに重ならないようにする方法はありますか?

レイヤーが隣接している(ほとんど接触している)場合、CALayersのいずれかの影がもう一方の上にレンダリングされますCALayer。ほとんどの場合、それはおそらく望ましい効果ですが、レイヤーが同じz平面に存在するようにしたいと思います。 (これの例は、ウェブデザインのブロック要素に影が適用される方法です。

これは可能ですか?どうすればこれを達成できますか?

(私は自分のシャドーイメージでそれぞれのCALayerに「影」サブレイヤーを追加し、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

関連する問題