пример replaceSublayer - PullRequest
       6

пример replaceSublayer

1 голос
/ 15 сентября 2010

У меня есть следующий код, и я не могу заставить его работать.

Сначала я создаю вид со слоем.

UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[view.layer insertSublayer:gradient atIndex:0];

Далее мне нужно заменить этот слой. Я попробовал следующее, и это не удалось, потому что я не знаю, как получить доступ к этому слою 0. На данный момент я нахожусь в другой части программы, поэтому я не могу просто вызвать Градиент . Мне нужно как-то вытащить его из зрения .

[view.layer replaceSublayer:0 with:newgradient];

Очевидно, 0 должен быть Старый слой , но я не знаю, как получить к нему доступ.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 15 сентября 2010

Я думаю, вы должны использовать это:

[view.layer replaceSublayer:[[view.layer sublayers] objectAtIndex:0]
            with:newGradient];

Я не в своей среде разработки Xcode, но пока не могу это проверить.

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

Вот функция:

#define MyGradientLayerName @"MyGradient"

void makeViewGradient(UIView *pView,BOOL bRemoveBackground,CGColorRef clr1,CGColorRef clr2)
{
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.name = MyGradientLayerName;

    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.name isEqualToString:MyGradientLayerName])
        {
            pGradientLayer = pLayer;
            break;
        }
    }
    if (!pGradientLayer) [pView.layer insertSublayer:gradient atIndex:0];
    else [pView.layer replaceSublayer:pGradientLayer with:gradient];

    if (bRemoveBackground) pView.backgroundColor = nil;//free memory !
}
1 голос
/ 15 сентября 2010

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

[self.layer sublayers];

Затем вы можете просмотреть и проверить некоторые параметры, чтобы увидеть, совпадают ли они.,Например, установите значение layer.name во время создания.

...