2008-10-28 13 views
8

Core Animation permite animaciones personalizadas mediante la aplicación del método de actionForKey en su clase basada CALayer:¿Cómo puedo usar animaciones personalizadas para onOrderOut en Core Animation?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

Entonces puede crear una animación y devolverlo para la acción onOrderIn (es decir, cuando se añade la capa a otra capa) . Esto funciona bien. Si hago lo mismo para onOrderOut (es decir, la capa se elimina de su supercapa), se ignora la animación devuelta y se aplica la animación predeterminada.

Mi objetivo es hacer un zoom en la capa (onOrderIn) y fuera (onOrderOut):

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

zoom en las obras, enfocando hacia fuera no. En cambio, se utiliza la animación de fundido de salida predeterminada.

El código puede contener algunos errores tipográficos, como yo estoy escribiendo esto en otra máquina.

¿Alguien puede ayudar?

Respuesta

4

Citando a John Harper en quartz-dev mailing list:

Hay un problema fundamental con devolver cualquier animación para el onOrderOut clave en el momento de la animación debe estar en ejecución, la capa ya no está en el árbol , por lo que no tiene efecto . Entonces onOrderOut no es útil para activar animaciones; puede ser útil para ejecutar otro código cuando las capas se eliminan del árbol.

La mejor solución que he encontrado para este (suponiendo que la transición de fundido por defecto en la matriz no es lo que quiere, que a menudo no lo es) es añadir personalizados animaciones para aplicar el efecto de eliminación usted quiere, entonces, en el delegado de animación didStop , realmente eliminar la capa. A menudo es conveniente crear un único grupo de animaciones con el conjunto de propiedades delegado, y FILLMODE = hacia delante, removedOnCompletion = NO para que pueda eliminar la capa al final de la animación sin la posibilidad de la capa siendo visible en su estado normal .

Si haces muchos casos de esto, es fácil escribir una superclase común que comienza una animación, establece el delegado de animación a la clase e implementos + animationDidStop: para eliminar la capa w/o animación habilitado. Esto restaura la naturaleza de disparar y olvidar de CoreAnimation que hubieras esperado que estuviera presente con la implementación predeterminada.

+0

Ah, gracias.Voy a probar esto si lo necesito de nuevo, mientras escribimos una versión completamente diferente del software con Qt Jambi. ;) – Lemming

0

¿Ha verificado que se llama a su método con key como @"onOrderOut" y que su método está devolviendo la animación correcta?

+0

Sí. En el código real, primero llamo a NSLog con el nombre de la acción y, de hecho, se solicita onOrderOut. También me aseguré de que la animación se crea y se devuelve, pero aún así, simplemente se ignora. – Lemming

Cuestiones relacionadas