2010-08-20 6 views
4

J'ai un CALayer A avec une sous-couche B Je veux que A soit redimensionné (pour être rétréci) donc j'ajoute les animations à ma couche A mais quand je commet la sous-couche d'animation B est pas rétréci. Sa taille reste (mais sa position change à mesure que les limites de sa super couche changent) Comment redimensionner ma couche B avec une animation?Redimensionnement des couches et de ses sous-couches - CoreAnimation

C'est ce que je l'ai écrit:

CABasicAnimation *fadeInAnimation; 
fadeInAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.repeatCount = 1; 
fadeInAnimation.autoreverses = NO; 
fadeInAnimation.fromValue = [NSNumber numberWithFloat:1.0]; 
fadeInAnimation.toValue = [NSNumber numberWithFloat:0.0]; 

CABasicAnimation *shrinkAnimation; 
shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"]; 
shrinkAnimation.repeatCount = 1; 
shrinkAnimation.autoreverses = NO; 
shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
shrinkAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0, 0)]; 

aniGroupOFF = [[CAAnimationGroup animation] retain]; 
aniGroupOFF.delegate = self; 
aniGroupOFF.duration = ANI_DURATION; 
aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, fadeInAnimation, nil]; 

Et le commets:

[self addAnimation:aniGroupOFF forKey:@"shrinkAndFade"]; 
self.opacity = 0.0; 

Réponse:

CABasicAnimation *shrinkAnimation; 
    shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; //use transform instead of bounds.size 
    shrinkAnimation.repeatCount = 1; 
    shrinkAnimation.autoreverses = NO; 
    shrinkAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
    shrinkAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(self.transform, 0.1, 0.1, 1.0)]; 

    aniGroupOFF = [[CAAnimationGroup animation] retain]; 
    aniGroupOFF.delegate = self; 
    aniGroupOFF.duration = ANI_DURATION; 
    aniGroupOFF.animations = [NSArray arrayWithObjects:shrinkAnimation, nil]; 
+0

La réponse peut fonctionner, mais vous pouvez même animer "transform.scale" et utiliser un NSNumber simple comme valeur. C'est ce dont je parlais dans ma réponse. – tonklon

Répondre

7

La meilleure façon d'y parvenir est d'animer le KeyPath "transform.scale" au lieu de "bounds.size". Si vous respectez "bounds.size", vous devrez implémenter layoutSublayers sur la couche A ou layoutSublayersOfLayer:(CALayer*)aLayer sur le délégué de A et ajuster manuellement la taille de B dans cette implémentation.

+0

Merci, je vais essayer transform.scale, mais une chose intéressante: j'ai écrit [layer setNeedsDisplayOnBoundsChange: YES]; et redéfinir layoutSublayer et essayé d'ajuster les limites/l'image de la sous-couche, mais layoutSublayer est seulement appelée en initialisation. Par conséquent, la sous-couche n'est pas rétrécie. – nacho4d

+0

Avez-vous implémenté layoutSublayers sur la couche A ou B? Devrait être A. Je ne peux pas penser pourquoi layoutSublayers sur A ne devrait pas être appelé quand ses limites sont animées. – tonklon

Questions connexes