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

标签 ios core-animation

我有一组 CALayers。每个层都是同一父层 CALayer 的子层,并且每个层都应用了阴影。这些层是动态定位的,而且层数很多,所以我无法提前预测它们将如何排列。

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

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

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

最佳答案

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

- (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

关于ios - 有没有办法防止 CALayer 阴影与相邻图层重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8484023/

相关文章:

objective-c - 为什么我的 CATextLayer 不响应contentsGravity 属性?

ios - UITableViewCell 的 subview 没有出现

iphone - 如何在纵向 View 中插入横向 subview ,就像 VEVO

ios - Urban Airship iOS 在 UIWebView 上显示消息正文

ios - iTunes connect - 无法添加新应用程序?

ios - 未调用 TouchesEnded 和 TouchesCancelled

ios - CAGradientLayer 显示为纯色

iphone - 多次更自然地为点设置动画

ios - CABasicAnimation 在完成时停止动画 - iOS

iphone - 如何在拍照后立即在预览中裁剪图像?