CALayer drawInContext против addSublayer
-
06-07-2019 - |
Вопрос
Как правильно использовать оба из них в одном и том же UIView?
У меня есть один пользовательский CALayer, в котором я рисую шаблон в drawInContext
У меня есть другой, в котором я устанавливаю наложение PNG-изображения в качестве содержимого.
У меня есть третий, который просто фон.
Как мне наложить все эти три элемента?
[self.layer addSublayer:bottomLayer]; // this line is the problem
[squaresLayer drawInContext:viewContext];
[self.layer addSublayer:imgLayer];
Остальные 2 сами рисуют правильно, если я делаю их в таком порядке. Независимо от того, где я пытаюсь поместить bottomLayer, он всегда предотвращает рисование squaresLayer. Мне нужны 3 слоя, потому что я намереваюсь анимировать цвета фона и пользовательских слоев. Верхний слой - это просто графическое наложение.
Решение
Можно также вставить код на тот случай, если кто-нибудь попытается анимировать составленные слои CALay, которые имеют свои собственные внутренние процедуры отрисовки
- (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 " несколько раз с таймером, и эта процедура повторяется, слои перерисовываются с использованием обновленных параметров.