2010-07-29 18 views
5

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

+0

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. –

+0

Esta pregunta fue una respuesta a mi pregunta, gracias;) –

+0

Tengo el mismo problema, lo he solucionado. [Aquí] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –

Respuesta

1

Es difícil decir qué está pasando sin ver más código. Tengo una aplicación de ejemplo que anima una propiedad personalizada y la posición de una capa al mismo tiempo. Puedes take a look at my source y ver qué hay diferente.

+0

Gracias por su código de ejemplo. Lo extendí para que se comporte igual que mi código (ver mi pregunta). – Chris

+0

La verdadera pregunta en este momento es ¿qué estás tratando de hacer? He revisado los cambios en tu código, pero no puedo entender por mi vida lo que quieres que haga. Si solo estás tratando de animar un par de rectángulos, no hay absolutamente ninguna razón para dibujarlo tú mismo. Debería simplemente agregar sus dos rectángulos como capas y animar sus posiciones como se muestra en mi código de ejemplo.Su propiedad personalizada es completamente innecesaria. Entonces, ¿qué estás tratando de hacer de nuevo? –

Cuestiones relacionadas