Tengo una aplicación con una subclase CALayer personalizada. En esta subclase de capa, he sobrescrito el método - (void) drawInContext:(CGContextRef)ctx
. Esto funciona bien y todo mi contenido personalizado se dibuja.CALayer no está dibujando su contenido mientras se usa CABasicAnimation
Ahora quería agregar una propiedad personalizada que se anima cuando se cambia el contenido. Y necesito volver a dibujar mientras la animación se está ejecutando. He añadido la propiedad como la dada en la respuesta a la siguiente pregunta: Animating a custom property of CALayer subclass
Y también he añadido una instancia CABasicAnimation de esta propiedad a mi capa:
CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"];
theAnimation.duration=1.0;
theAnimation.fromValue=[NSNumber numberWithFloat:0.0];
theAnimation.toValue=[NSNumber numberWithFloat:10.0];
[area addAnimation:theAnimation forKey:@"moveContentToLeft"];
En mi método draw Tengo una declaración NSLog en que genero el valor de mi propiedad que estoy animando.
Mi problema es que, tan pronto como se inicia la animación, se borra todo el contenido de la subclase de la capa. El NSLog genera los valores de mi propiedad que se interpola (por lo que se llama al método drawInContext). Pero de alguna manera, las cosas que dibuja no son visibles durante la animación. Al final de la animación, el contenido original vuelve a ser visible.
Por el momento, la propiedad animada aún no se utiliza al dibujar la capa, por lo que esperaría que el contenido normal se dibujara de nuevo y obtuviera la salida del NSLog con los valores interpolados.
Mi capa es hija de otra capa (dentro de una UIView). Intenté volver a dibujar la capa superior al final del método de dibujo (con la llamada _parent setNeedsDisplay [parent es un ivar a la vista primaria]). Esto no ayudó. Y también tengo la sensación de que no es una buena idea hacerlo.
Espero que alguien me pueda ayudar con este problema.
actualización
Gracias al proyecto ejemplo de Matt tiempo podría ver que mi problema se encuentra en el interior del método de dibujo. Extendí su proyecto por lo que muestra el mismo problema. Creo que es más fácil de mostrar que el código original;)
- (void)drawInContext:(CGContextRef)ctx
{
NSLog(@"Getting called: Bob: %i", [self bob]);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100));
CGContextAddPath(ctx, path);
CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
CGContextSetLineWidth(ctx, 1.0);
CGContextStrokePath(ctx);
CGPathRelease(path);
[_test testInContext:ctx]; // here is the problem
}
El Ivar _test
es una clase personalizada que contiene un código de dibujo (en el momento en que se dibuja una caja verde). El problema ahora es que este recuadro verde no se dibujará mientras se ejecuta la animación. Tan pronto como finaliza la animación, el cuadro verde vuelve a estar visible. El proyecto de ejemplo extendido: http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip
Creo que puede ser útil mostrar el código de dibujo además del código de animación. No parece haber ningún problema con el código de animación. –
Esta pregunta fue una respuesta a mi pregunta, gracias;) –
Tengo el mismo problema, lo he solucionado. [Aquí] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –