пример replaceSublayer

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

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

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.

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

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

Спасибо.


person John Smith    schedule 14.09.2010    source источник


Ответы (3)


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

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

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

person Greg    schedule 14.09.2010

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

[self.layer sublayers];

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

person Justin Meiners    schedule 14.09.2010

Вот функция:

#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 !
}
person Nick Utenkov    schedule 21.09.2011