2011-09-28 28 views
9

He intentado crear un efecto de texto genial con CAReplicatorlayer, CATextLayer y animaciones muy básicas. Estoy tratando de hacer que las letras parezcan que se están cayendo desde la parte superior de la pantalla seguidas por replicadores geniales que se volverán cada vez menos visibles. He logrado hacer este efecto pero no completamente.Trabajando con CAReplicatorLayer

Hasta el momento esto es lo que tengo:

CATextLayer *messageLayer = [CATextLayer layer]; 

[messageLayer setForegroundColor:[[UIColor blackColor] CGColor]]; 
[messageLayer setContentsScale:[[UIScreen mainScreen] scale]]; 
[messageLayer setFrame:CGRectMake(0, 0, 40, 40)]; 
[messageLayer setString:@"A"]; 


CAReplicatorLayer *replicatorX = [CAReplicatorLayer layer]; 

//Set the replicator's attributes 
replicatorX.frame = CGRectMake(0, 0, 40, 40); 
replicatorX.anchorPoint = CGPointMake(0,0); 
replicatorX.position = CGPointMake(0, 0); 
replicatorX.instanceCount = 9; 
replicatorX.instanceDelay = 0.15; 
replicatorX.instanceAlphaOffset = -0.1; 

replicatorX.zPosition = 200; 
replicatorX.anchorPointZ = -160; 

[replicatorX addSublayer:messageLayer]; 

[self.view.layer addSublayer:replicatorX]; 


messageLayer.position = CGPointMake(40, 400); 
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.y"]; 
animation.fromValue = [NSNumber numberWithInt:0];; 
animation.toValue = [NSNumber numberWithInt:400]; 
animation.duration = 3; 
[messageLayer addAnimation:animation forKey:@"s"]; 

Tengo dos problemas:

  1. Las capas replicados están empezando en el punto final.
  2. Cuando la capa principal alcanza su último punto animado, la animación se detiene y las capas replicadas no pueden finalizar su animación.

Respuesta

5

Configuración de los valores correctos a las propiedades FILLMODE y removedOnCompletion del objeto de animación de esperar que va a resolver sus problemas:

"Las capas replicados están empezando en el punto final."

Esto se debe al valor asignado a la propiedad instanceDelay, que retrasa la animación con 0.15s en su ejemplo. Para presentar la animación desde fromValue, debe justificar este retraso configurando fillMode de la animación en kCAFillModeBackwards.

animation.fillMode = kCAFillModeBackwards; 

"Cuando la capa principal llegar a su último punto de animación se detenga la animación y las capas replicados no pudo terminar su animación."

Esto ocurre porque de forma predeterminada "la animación se elimina de las animaciones de la capa de destino una vez completada". 1. Puede anular este comportamiento predeterminado configurando el atributo de animación removedOnCompletion en NO.

animation.removedOnCompletion = NO; 

Espero que esto ayude. :)