有没有一种方法可以防止CALayer的阴影与相邻层重叠?

8
我有一个CALayer的集合。每个图层都是同一父CALayer的子图层,每个图层都应用了一个阴影。这些图层是动态定位的,并且有很多,所以我无法预测它们将如何排列。
如果这些图层相邻(接近到它们几乎触摸),则一个CALayer的阴影会呈现在另一个CALayer之上。在大多数情况下,这可能是期望的效果,但我希望我的图层存在于同一z平面上。(Web设计中块元素应用CSS3阴影的例子就是这种情况。)
这是否可能?我该如何实现?
(我有这样的想法:为每个CALayer添加一个“阴影”子图层,并使用自己的阴影图像将z位置设置为较低的值。但是,图层树使这不可能吗?一个图层坐标系中的z位置与另一个图层坐标系中的z位置是独立的,对吗?)
1个回答

21

如果所有的阴影层具有相同的阴影设置,将它们放入一个容器层,并在容器层上设置阴影。例如:

- (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];
}

输出:

带有统一阴影的重叠圆


哇,谢谢!这个想法事后看来非常明显。我也有过这个想法,但我认为它会在容器层的形状上应用阴影(无论那是什么,哈哈)。 - Andrew Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接