Смешивание CAGradientLayer используется как тень - PullRequest
13 голосов
/ 02 ноября 2011

У меня есть CAGradientLayer, который я использую как тень.Он исчезает с 60% непрозрачности, чтобы очистить, слева направо.На краю градиента, он, кажется, смешивается со слоем под ним и осветляет этот слой:

Notice the ~1 pixel wide lightened effect on the photo beneath the shadow

В самом конце есть "свечение" шириной в один пиксельтени, где она исчезла, чтобы очистить.Кажется, что фотография позади тени светлее в хвосте тени.Вот крупный план:

enter image description here

Это код, который создает эту тень:

CAGradientLayer *layer = [CAGradientLayer layer];
layer.frame = CGRectMake(sideBar.frame.size.width, 0, 7, sideBar.frame.size.height);
layer.colors = [NSArray arrayWithObjects:
                (id)[[[UIColor blackColor] colorWithAlphaComponent:0.6f] CGColor],
                (id)[[UIColor clearColor] CGColor],
                nil];
[layer setStartPoint:CGPointMake(0, 0.5)];
[layer setEndPoint:CGPointMake(1, 0.5)];
[sideBar.layer insertSublayer:layer atIndex:0];  
sideBar.layer.masksToBounds = NO;

Есть идеи о том, как избавиться от этого?

1 Ответ

22 голосов
/ 02 ноября 2011

Твои глаза обманывают тебя. Там нет увеличения интенсивности на краю градиента. Вы можете проверить - я сократил изображение до 1px высоты в облачной области и посмотрел на значения цвета. image shrunk to 1px height

Однако причина, по которой вы видите яркую линию, в том, что тени выглядят не так. Профиль прозрачности, который вы ожидаете увидеть, будет ближе к гауссову, чем к прямой линии (что и делает линейный градиент).

Я бы рекомендовал добавить несколько дополнительных точек, чтобы ослабить градиент в прозрачной области. Возможно, что-то вроде этого

layer.colors = [NSArray arrayWithObjects:
                (id)[[[UIColor blackColor] colorWithAlphaComponent:0.6f] CGColor],
                (id)[[[UIColor blackColor] colorWithAlphaComponent:0.3f] CGColor],
                (id)[[[UIColor blackColor] colorWithAlphaComponent:0.1f] CGColor],
                (id)[[UIColor clearColor] CGColor],
                nil];

Возможно, вам придется увеличить размер градиента, чтобы учесть это дополнительное смешение.

...