У меня уже есть градиент на моем UIView, возникают проблемы при вставке нового - PullRequest
4 голосов
/ 10 марта 2011

Это код, который у меня уже есть:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = backGradient.frame;
gradient.colors = [NSArray arrayWithObjects:(id)[newGradientTop CGColor], (id)[newGradientBottom CGColor], nil];
[backGradient.layer insertSublayer:gradient atIndex:0];

Сейчас я пытаюсь показать новый градиент вместо этого, используя тот же блок кода, но в него входят разные цвета.Но новый градиент не отображается, и я думаю, что это потому, что он не будет отображаться над уже существующим градиентом.

Как я могу это исправить?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Используйте эту функцию (заменив старый градиентный слой новым):

#define kGradientLayerKey @"MyGradientLayer"

void makeViewGradient(UIView *pView,CGColorRef clr1,CGColorRef clr2)
{
    CAGradientLayer *gradient = [CAGradientLayer layer];
    [gradient setValue:@"1" forKey:kGradientLayerKey];

    gradient.frame = pView.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)clr1,(id)clr2,nil];

    CALayer *pGradientLayer = nil;
    NSArray *ar = pView.layer.sublayers;
    for (CALayer *pLayer in ar)
    {
        if ([pLayer valueForKey:kGradientLayerKey])
        {
            pGradientLayer = pLayer;
            break;
        }
    }
    if (!pGradientLayer) [pView.layer insertSublayer:gradient atIndex:0];
    else [pView.layer replaceSublayer:pGradientLayer with:gradient];

    pView.backgroundColor = nil;//free memory !
}
2 голосов
/ 10 марта 2011

Вместо добавления дополнительных слоев следите за исходным слоем и замените его новым. Вы, вероятно, хотите использовать -replaceSublayer:with: здесь.

0 голосов
/ 10 марта 2011

[backGradient.layer insertSublayer:gradient atIndex:0] вставляет новый слой внизу стека под любыми другими слоями. Пытаться [backGradient.layer addSublayer:gradient] вместо.

...