CALayer drawInContext против addSublayer - PullRequest
       16

CALayer drawInContext против addSublayer

3 голосов
/ 01 августа 2009

Как правильно использовать оба этих параметра в одном и том же UIView?

У меня есть один пользовательский CALayer, в котором я рисую шаблон в drawInContext

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

У меня есть третий, который просто фон.

Как мне наложить все эти три элемента?

[self.layer addSublayer:bottomLayer];    // this line is the problem

[squaresLayer drawInContext:viewContext];
[self.layer addSublayer:imgLayer];

Остальные 2 сами по себе правильно рисуют, если я делаю их в таком порядке. Независимо от того, где я пытаюсь поместить bottomLayer, он всегда предотвращает рисование squaresLayer. Мне нужны 3 слоя, потому что я намереваюсь анимировать цвета фона и пользовательских слоев. Верхний слой - это просто графическое наложение.

1 Ответ

1 голос
/ 02 августа 2009

Можно также вставить код на случай, если кто-нибудь попытается анимировать составленные CALayers, которые имеют свои собственные внутренние процедуры рисования

- (void)drawRect:(CGRect)rect {

    [imgLayer removeFromSuperlayer];

    CGFloat w = [self.blockViewDelegate w];
    CGFloat h = [self.blockViewDelegate h];

    CGFloat wb = w/4;
    CGFloat hb = h/4;

    CGContextRef viewContext = UIGraphicsGetCurrentContext();

    // Layers

    [bottomLayer sizes:wb :hb :1];
    bottomLayer.frame = CGRectMake(0, 0, w, h);
    bottomLayer.opaque = NO;

    [topLayer sizes:wb :hb :0];
    topLayer.frame = CGRectMake(0, 0, w, h);
    topLayer.opaque = NO;

    // Overlay

    imgLayer.frame = CGRectMake(0, 0, w, h);
    imgLayer.opaque = NO;
    imgLayer.opacity = 1.0f;

    UIImage *overlay = [self.blockViewDelegate image];
    CGImageRef img = overlay.CGImage;
    imgLayer.contents = (id)img;

    // Add layers

    [bottomLayer drawInContext:viewContext];
    [topLayer drawInContext:viewContext];
    [self.layer addSublayer:imgLayer];

}

blockViewDelegate - это место, где я храню информацию о ширине, высоте и изображении, это контроллер для этого UIView.

topLayer и bottomLayer имеют пользовательский подкласс UIView, который рисует некоторые формы в представлении с переменной информацией о цвете. Позже в моей анимации я просто несколько раз запускаю «setNeedsDisplay» с таймером, и эта процедура повторяется, слои перерисовываются с использованием обновленных параметров.

...