Как применить CAGradientLayer как маску другого CALayer?

У меня есть представление, в котором есть CALayer. Когда я создаю CAGradientLayer и применяю его как маску CALayer этого представления, ничего не происходит. Почему?

В -initWithFrame: представления я делаю следующее:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
//[self.layer insertSublayer:gradient atIndex:0];
self.layer.mask = gradient;

Если я заменю

self.layer.mask = gradient;

с участием

[self.layer insertSublayer:gradient atIndex:0];

затем я вижу градиент. От черного к белому.

Что за хитрость?


person Proud Member    schedule 30.05.2012    source источник
comment
Для других, которые борются с маской градиента, она не будет работать, если будет применена к UIStackView.   -  person Iulian Onofrei    schedule 08.06.2017


Ответы (1)


Свойство маски в CALayer использует компонент alpha слоя маски, чтобы определить, что должно быть видимым, а что нет. Поскольку оба ваших цвета (черный и белый) полностью непрозрачны (без прозрачности), маска не действует. Чтобы исправить это, вы должны изменить один из цветов на прозрачный:

gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], 
                                            (id)[[UIColor clearColor] CGColor], nil];

Вот и вся "хитрость": D

person David Rönnqvist    schedule 30.05.2012