2012-07-22 4 views
0

J'ai deux objets CALayer - layer1, layer2. Je veux effectuer les actions suivantes -Comment synchroniser l'ajout d'un nouvel objet CALayer avec des animations d'un autre objet

  • ajouter layer1 à la couche utilisateur addSublayer de vue:
  • mouvement layer1 à une nouvelle position à l'aide d'un CABasicAnimation
  • ajouter layer2 à la couche
  • déplacer layer2 de la vue à une nouvelle position

Ceci, sans layer2 montrant jusqu'à ce que l'animation de layer1 soit complète.

J'ai essayé ceci en mettant beginTime sur l'animation de layer2 à l'heure de fin de l'animation de layer1 - mais layer2 montre pendant l'intervalle avant son heure de début.

Des suggestions?

Répondre

0

J'ai découvert une méthode pour atteindre mon résultat. Je ne suis pas sûr que ce soit la meilleure façon de le faire, je serais toujours reconnaissant pour d'autres idées.

Je crée les calques layer1 et layer2 en même temps et ajoute les deux calques à la couche view.layer. Ensuite, j'anime layer1 pour le déplacer vers une nouvelle position, duration = 0.3. Pour layer2 je m'anime avec un groupe qui consiste en un mouvement (beginTime = 0.3, durée = 0.3) et une autre animation utilisant l'attribut caché. Cette dernière masque immédiatement layer2, puis le affiche à beginTime = 0.3. Pour réaliser cette dernière animation, j'ai utilisé un CAKeyFrameAnimation parce que cette animation doit être discrète - soit entièrement cachée, soit totalement non cachée.

Voici le code. Je l'ai simplifié en supprimant des détails sur ma mise en œuvre, donc ce n'est pas le code réel dans mon application - des excuses s'il y a des erreurs.

CALayer layer1 = [CALayer layer]; 
CALayer layer2 = [CALayer layer]; 

/* 
* set attributes of the layers -- cut out of this example 
*/ 
layer1.position = toPosition1; // positions when animation is complete 
layer2.position = toPosition2; 

[myView.layer addSublayer:layer1]; 
[myView.layer addSublayer:layer2]; 

// animate layer 1 
CABasicAnimation* move1 = [CABasicAnimation animationWithKeyPath:@"position"]; 
move1.duration = 0.3; 
move1.fromValue = fromPosition2; 
[layer1 addAnimation:move1 forKey:nil]; 

// animate layer 2 with a group 
CABasicAnimation* move2 = [CABasicAnimation animationWithKeyPath:@"position"]; 
move2.duration = 0.3; 
move2.fromValue = fromPosition2; 
move2.beginTime = 0.3; 

CAKeyframeAnimation *show = [CAKeyframeAnimation animationWithKeyPath:@"hidden"]; 
show.values = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], [NSNumber numberWithBool:NO], nil]; 
// times are given as fractions of the duration time -- hidden for first 50% of 0.6 sec 
show.keyTimes = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:1.0], nil]; 
show.calculationMode = kCAAnimationDiscrete; 
show.duration = 0.6; 
show.beginTime = 0; 

CAAnimationGroup *grp = [CAAnimationGroup animation]; 
[grp setAnimations:[NSArray arrayWithObjects:move2, show, nil ]]; 
grp.duration = 0.6; 

[layer2 addAnimation:grp forKey:nil]; 

Je

Questions connexes