2012-06-07 11 views
29

Ho questo codice per animare un elemento CALayer.Come posso creare un oggetto CABasicAnimation per più proprietà?

CABasicAnimation *makeBiggerAnim=[CABasicAnimation animationWithKeyPath:@"radius"]; 
makeBiggerAnim.duration=0.2; 
makeBiggerAnim.fromValue=[NSNumber numberWithDouble:20.0]; 
makeBiggerAnim.toValue=[NSNumber numberWithDouble:40.0]; 
makeBiggerAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

La mia domanda è, ora tutto funziona bene, vorrei un altro attributo dello stesso elemento allo stesso tempo. Ho visto che puoi fare animazioni e cose aggiuntive.

La mia domanda è:

  • è l'attributo l'additivo il migliore/unico modo per farlo? (animando contemporaneamente più proprietà dello stesso oggetto contemporaneamente)

Grazie!

+0

Cosa fa il percorso del raggio di raggio? A che tipo di livello stai aggiungendo questa animazione? Non conosco una proprietà raggio su qualsiasi oggetto layer CA. –

+1

Ho esteso la classe CALayer per creare un oggetto rotondo personalizzato. Funziona benissimo grazie alle tue risposte :) –

risposta

54

È possibile creare un CAAnimationGroup e personalizzare la durata e la funzione di temporizzazione su di esso. Quindi crei tutti i tuoi CABasicAnimations, imposta il loro valore e li aggiungi al gruppo di animazione. Infine, aggiungi il gruppo di animazione al livello che stai animando.

Ecco un esempio:

CABasicAnimation *makeBiggerAnim=[CABasicAnimation animationWithKeyPath:@"cornerRadius"]; 
makeBiggerAnim.fromValue=[NSNumber numberWithDouble:20.0]; 
makeBiggerAnim.toValue=[NSNumber numberWithDouble:40.0]; 

CABasicAnimation *fadeAnim=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeAnim.fromValue=[NSNumber numberWithDouble:1.0]; 
fadeAnim.toValue=[NSNumber numberWithDouble:0.0]; 

CABasicAnimation *rotateAnim=[CABasicAnimation animationWithKeyPath:@"transform.rotation.y"]; 
rotateAnim.fromValue=[NSNumber numberWithDouble:0.0]; 
rotateAnim.toValue=[NSNumber numberWithDouble:M_PI_4]; 

// Customizing the group with duration etc, will apply to all the 
// animations in the group 
CAAnimationGroup *group = [CAAnimationGroup animation]; 
group.duration = 0.2; 
group.repeatCount = 3; 
group.autoreverses = YES; 
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
group.animations = @[makeBiggerAnim, fadeAnim, rotateAnim]; 

[myLayer addAnimation:group forKey:@"allMyAnimations"]; 
+20

Nota che tutte le animazioni di un gruppo devono apportare modifiche allo stesso livello. Ho scoperto nel modo più duro che non è possibile raggruppare le animazioni applicate a diversi livelli con CAAnimationGroup. –

+0

BTW, cosa fa il percorso del raggio del raggio? A che tipo di livello stai aggiungendo questa animazione? –

+1

@DuncanC Scusa ... l'ho preso dal codice dell'OP. Dovrebbe probabilmente essere cornerRadius. Inoltre, l'OP chiede come animare "più proprietà dello stesso oggetto" –

1

In Swift-3 possiamo usare CAAnimationGroup come di seguito: -

 let position = CAKeyframeAnimation(keyPath: "position") 
     position.values = [ NSValue.init(cgPoint: .zero) , NSValue.init(cgPoint: CGPoint(x: 0, y: -20)) , NSValue.init(cgPoint: .zero) ] 
     position.timingFunctions = [ CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) ] 
     position.isAdditive = true 
     position.duration = 1.2 

     let rotation = CAKeyframeAnimation(keyPath: "transform.rotation") 
     rotation.values = [ 0, 0.14, 0 ] 
     rotation.duration = 1.2 
     rotation.timingFunctions = [ CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) ] 

     let fadeAndScale = CAAnimationGroup() 
     fadeAndScale.animations = [ position, rotation] 
     fadeAndScale.duration = 1 
3
let groupAnimation = CAAnimationGroup() 
groupAnimation.beginTime = CACurrentMediaTime() + 0.5 
groupAnimation.duration = 0.5 


let scaleDown = CABasicAnimation(keyPath: "transform.scale") 
scaleDown.fromValue = 3.5 
scaleDown.toValue = 1.0 
let rotate = CABasicAnimation(keyPath: "transform.rotation") 
rotate.fromValue = .pi/10.0 
rotate.toValue = 0.0 
let fade = CABasicAnimation(keyPath: "opacity") 
fade.fromValue = 0.0 
fade.toValue = 1.0 

groupAnimation.animations = [scaleDown,rotate,fade] 
loginButton.layer.add(groupAnimation, forKey: nil) 

Questo è per il più recente aggiornamento rapido (rapido 3). Il tuo codice dovrebbe includere un oggetto alla fine, ad esempio UIButton, UILabel, qualcosa che puoi animare. Nel mio codice era il loginButton (che era il titolo o il nome).

Problemi correlati