2012-06-07 86 views
29

我有這段代碼來動畫一個CALayer元素。如何爲多個屬性創建CABasicAnimation?

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

我的問題是,現在一切正常,我想在同一時間同一元素的另一個屬性。我見過你可以做添加動畫和東西。

我的問題是:

  • 是加屬性做到這一點的最好的/唯一途徑? (同時立即動畫同一物體的多個屬性)

謝謝!

+0

半徑鍵路徑做什麼?你將這個動畫添加到哪一層?我不知道任何CA層對象上的半徑屬性。 –

+1

我擴展了CALayer類來做一個自定義的圓形對象。它非常好,謝謝你的回答:) –

回答

54

您可以創建一個CAAnimationGroup並自定義其持續時間和計時功能。然後創建所有CABasicAnimations,將它們設置爲值並將它們添加到動畫組。最後,將動畫組添加到您正在動畫的圖層。

這裏的示例:

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

請注意,組中的所有動畫必須對同一圖層進行更改。我發現了難以將CAAnimationGroup應用於不同圖層的動畫分組的難題。 –

+0

順便說一下,半徑鍵路徑是做什麼的?你將這個動畫添加到哪一層? –

+1

@DuncanC對不起......我把它從OP的代碼中拿出來了。它可能應該是cornerRadius。另外,OP要求如何動畫「同一對象的多個屬性」 –

1

夫特-3我們可以使用如下CAAnimationGroup: -

 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) 

這對於迅速的最新更新(迅速3)。你的代碼應該在最後包含一個對象,即UIButton,UILabel,你可以動畫的東西。在我的代碼中,它是loginButton(它是標題或名稱)。