Есть ли способ, чтобы тени CALayer не перекрывали соседние слои? - PullRequest
7 голосов
/ 13 декабря 2011

У меня есть коллекция CALayers. Каждый слой является подслоем одного и того же родителя CALayer, и к каждому из них применена тень. Слои расположены динамически, и их много, поэтому я не могу предсказать, как они будут расположены раньше.

Если слои расположены рядом друг с другом (достаточно близко, чтобы они почти соприкасались), тень одного из CALayers отображается поверх другого CALayer. Это, вероятно, желаемый эффект в большинстве случаев, но я хочу, чтобы мои слои существовали в одной плоскости z. (Примером этого является способ применения CSS3 теней к элементам блока в веб-дизайне.)

Возможно ли это? Как мне этого добиться?

(У меня была такая идея: добавление подслоя 'shadow' к каждому CALayer с моим собственным теневым изображением и установка более низкого значения z-позиции. Но разве дерево слоев не делает это невозможным? Z -позиции в системе координат одного слоя не зависят от z-позиций в системе координат другого слоя, верно?)

1 Ответ

21 голосов
/ 13 декабря 2011

Если все затененные слои имеют одинаковые настройки тени, поместите их в слой контейнера и задайте тень на слое контейнера.Пример:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...