2010-11-08 14 views
8

Hasta ahora he podido animar las propiedades personalizadas de mi subclase CALayer, gracias a + (BOOL)needsDisplayForKey:(NSString *)key y .Animar propiedades personalizadas de CALayer dentro de una CATransacción

Sin embargo, resulta que encadenar animaciones puede ser muy complicado porque todo el código se lleva a cabo en un solo método animationDidStop:finished:.

Así que quería cambiar a CATransactions ya que admiten la nueva sintaxis de bloque, lo que me permitiría especificar un bloque de finalización con + (void)setCompletionBlock:(void (^)(void))block.

Pero me parece que CATransaction sólo puede animar a los llamados '' animables propiedades y que no funciona con mis propiedades de las capas a medida, incluso con el método implementado needsDisplayForKey:.

¿Hay alguna forma de crear propiedades personalizadas en un CALayer para animar con CATransaction?

EDIT: Mi intención es hacer algo a lo largo de las líneas:

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.5]; 
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[CATransaction setCompletionBlock:^{ 
    NSLog(@"blabla"); 
}]; 

myLayer.myProperty = newValue; 

[CATransaction commit]; 

La actualización del valor myProperty a newValue no está animado. Intenté implementar actionForLayer:forKey: en la vista que administra myLayer para devolver CABasicAnimation. Pero actionForLayer:forKey: nunca se llama con la clave myProperty. Y sí, myLayer no es view.layer sino una subcapa, y sí configuro el delegado de myLayer en la vista que contiene.

Respuesta

10

Creo, basado en mi lectura de algunos códigos fuente, que todavía puede usar un CABasicAnimation dentro del CATransaction. Cualquier CAAnimations agregado entre [CATransaction begin] y [CATransaction commit] debe ser parte de la transacción.

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.5]; 
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[CATransaction setCompletionBlock:^{ 
    NSLog(@"blabla"); 
}]; 

// Create the CABasicAnimation using your existing code 
CABasicAnimation *myPropertyAnim = [CABasicAnimation animationWithKeyPath:@"myProperty"]; 
// TODO: Setup animation range 
myPropertyAnim.toValue = newValue; 

// The CATransaction does not observe arbitrary properties so this fails: 
//myLayer.myProperty = newValue; 

// Add the CAAnimation subclass during the CATransaction 
[myLayer addAnimation:myPropertyAnim forKey:@"myKey"]; 

[CATransaction commit]; 

Disculpa que no tengo una configuración de proyecto para probar esto fácilmente, pero creo que funcionará.

Compruebe estos sitios para el código:

código que hice referencia:

[CATransaction begin]; 
[topLayer addAnimation:topAnimation forKey:@"flip"]; 
[bottomLayer addAnimation:bottomAnimation forKey:@"flip"]; 
[CATransaction commit]; 
+0

confirmo que funciona sin embargo, me siento un poco decepcionado de que no es posible tener la misma magia detrás de las propiedades personalizadas que las propiedades animables. Y voy a ejecutar algunas pruebas para ver qué pasa si la duración de la CATransaction se establece en un valor inferior al que ninguno de los del enlace adjunto CAAnimations – romrom

1

Hay una gran clase llamada CAAnimationBlocks, y explicó here , Eso es un gato egory en CAAnimation que le permite usar bloques de finalización como lo haría en una UIView.

Se utiliza simplemente llamando:

CABasicAnimation myAnimation; 
[myAnimation setCompletion:^(BOOL finished) { // Do something }]; 
+0

no existe – Leena

Cuestiones relacionadas