有没有办法防止CALayer阴影重叠相邻的图层?

And*_*ark 7 core-animation ios

我有一个集合CALayers.每个图层都是同一父图层的子图层,每个图层都CALayer应用了一个阴影.这些图层是动态定位的,其中有很多层,所以我无法预测它们将如何提前排列.

如果这些层彼此相邻(足够接近以至于它们几乎接触),则其中一个的阴影CALayers将呈现在另一个之上CALayer.在大多数情况下,这可能是理想的效果,但我希望我的图层存在于同一个z平面中.(这方面的一个例子是CSS3阴影应用于网页设计中的块元素.)

这可能吗?我怎样才能做到这一点?

(我有这个想法:CALayer用我自己的阴影图像为每个阴影图像添加一个'阴影'子图层,并将z位置设置为较低的值.但是层树不能使这个不可能吗?在一个层的坐标中的Z位置系统独立于另一层坐标系中的z位置,对吧?)

rob*_*off 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];
}
Run Code Online (Sandbox Code Playgroud)

输出:

重叠圆圈与统一阴影