CALayer drawInContext vs addSublayer
-
06-07-2019 - |
Pregunta
¿Cómo puedo usar ambos en la misma UIView correctamente?
Tengo un CALayer subclasificado personalizado en el que dibujo un patrón dentro de drawInContext
Tengo otro en el que configuro una imagen PNG superpuesta como contenido.
Tengo un tercero que es solo un fondo.
¿Cómo superpongo los 3 de estos elementos?
[self.layer addSublayer:bottomLayer]; // this line is the problem
[squaresLayer drawInContext:viewContext];
[self.layer addSublayer:imgLayer];
Los otros 2 por sí mismos dibujan correctamente si los hago en ese orden. No importa dónde intente y ponga bottomLayer, siempre evita que squaresLayer se dibuje. La razón por la que necesito 3 capas es que tengo la intención de animar los colores en el fondo y las capas personalizadas. La capa superior es solo una superposición gráfica.
Solución
También podría pegar el código en caso de que alguien esté tratando de animar CALayers apilados que tienen sus propias rutinas internas de dibujo
- (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 es donde estoy almacenando información de ancho, alto e imagen, es el controlador para esta UIView.
topLayer y bottomLayer son de una subclase personalizada de UIView que dibuja algunas formas en la vista con información de color variable. Más adelante, en mi animación, simplemente ejecuto "setNeedsDisplay". repetidamente con un temporizador y esta rutina se repite, las capas se vuelven a dibujar utilizando parámetros actualizados.