2012-06-07 13 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レイヤーオブジェクトのradiusプロパティも知らない。 –

+1

CALayerクラスを拡張してカスタムラウンドオブジェクトを作成しました。それはあなたの答えに大きな感謝を働かせます:) –

答えて

54

CAAnimationGroupを作成し、期間とタイミング機能をカスタマイズすることができます。次に、CABasicAnimationsをすべて作成し、値をvalueに設定してアニメーショングループに追加します。最後に、アニメートするレイヤーにアニメーショングループを追加します。

ここ例:私たちは以下のようにCAAnimationGroupを使うを使用することができスウィフト-3において

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

: -

 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(タイトルまたは名前)でした。

関連する問題