2012-06-07 20 views
29

CALayer öğesini hareketlendirmek için bu kodu kullanıyorum.Birden çok özellik için bir CABasicAnimation nasıl oluşturabilirim?

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]; 

Sorum şu anda, her şey iyi çalışıyor, aynı öğenin aynı anda başka bir niteliğini istiyorum. Eklemeli animasyonlar ve şeyler yapabileceğinizi gördüm.

Sorum şu:

  • katkı Bunu yapmanın en iyi/tek yolu özellik var mı? (Aynı nesnenin aynı anda birden fazla özelliğini tek seferde canlandırma)

Teşekkürler!

+0

Yarıçap anahtar yolu ne yapar? Bu animasyonu ne tür bir katmana ekliyorsunuz? Herhangi bir CA katmanı nesnesinde yarıçap özelliği bilmiyorum. –

+1

Özel bir yuvarlak nesne yapmak için CALayer sınıfını genişlettim. Yanıtlarınız için çok teşekkürler :) –

cevap

54

Bir CAAnimationGroup oluşturabilir ve üzerinde süre ve zamanlama işlevini özelleştirebilirsiniz. Sonra tüm CABasicAnimations'unuzu yaratır, onların değerini ayarlar ve bunları animasyon grubuna eklersiniz. Son olarak, animasyon grubunu, animasyon yaptığınız katmana eklersiniz. İşte

bir örnek:

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

Bir gruptaki tüm animasyonların aynı katmana değişiklik yapması gerektiğini unutmayın. CAAnimationGroup ile farklı katmanlara uygulanan animasyonları gruplayamamanın zor yolunu keşfettim. –

+0

BTW, yarıçap anahtar yolu ne yapar? Bu animasyonu ne tür bir katmana ekliyorsunuz? –

+1

@DuncanC Üzgünüm ... Bunu OP'nin kodundan aldım. Muhtemelen köşe Radius olmalı. Ayrıca, OP "aynı nesnenin birden çok özelliğini" nasıl canlandırılacağını soruyor. –

1

yılında Swift-3 biz aşağıda CAAnimationGroup kullanabilirsiniz: -

 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) 

Bu (swift en yeni güncellemesi içindir hızlı 3). Kodunuz sonunda bir nesne içermelidir, yani UIButton, UILabel, canlandırabileceğiniz bir şey. Benim kodumda loginButton (başlık veya isim) idi.

İlgili konular