我有一个CALayers
的集合。每个图层都是同一个父CALayer
的子图层,每个图层都应用了一个阴影。这些图层是动态定位的,其中有很多层,所以我无法预测它们将如何提前安排。
如果图层彼此相邻(足够接近它们几乎接触),其中一个CALayers
的阴影将呈现在另一个CALayer
之上。在大多数情况下,这可能是理想的效果,但我希望我的图层存在于同一个z平面中。 (这方面的一个例子是 CSS3 阴影应用于网页设计中的块元素的方式。)
这可能吗?我怎样才能做到这一点?
(我有这个想法:用我自己的阴影图像为每个CALayer
添加一个'阴影'子图层,并将z位置设置为较低的值。但是层树不能使这个不可能?一层坐标系中的Z位置与另一层坐标系中的z位置无关,对吗?)
答案 0 :(得分: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];
}
输出: