2012-06-07 27 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]; 

मेरा प्रश्न अब सब कुछ ठीक काम करता है, है, मैं एक ही समय में एक ही तत्व के एक और विशेषता चाहते हैं। मैंने देखा है कि आप additive एनिमेशन और सामान कर सकते हैं।

मेरा प्रश्न है:

  • additive सबसे अच्छा/केवल ऐसा करने के लिए जिस तरह से विशेषता है? (एक ही ऑब्जेक्ट के एक साथ कई बार एक ही ऑब्जेक्ट पर एनिमेटिंग)

धन्यवाद!

+0

त्रिज्या कुंजी पथ क्या करता है? आप इस एनीमेशन को किस प्रकार की परत जोड़ रहे हैं? मैं किसी भी सीए परत वस्तुओं पर त्रिज्या संपत्ति के बारे में नहीं जानता। –

+1

मैंने कस्टम राउंड ऑब्जेक्ट करने के लिए कैलियर क्लास को बढ़ाया। यह आपके उत्तरों के लिए बहुत अच्छा धन्यवाद करता है :) –

उत्तर

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 क्षमा करें ... मैंने इसे ओपी के कोड से लिया। यह शायद कोनेराइडस होना चाहिए। इसके अलावा, ओपी कैसे –

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, जो आप एनिमेट कर सकते हैं। मेरे कोड में यह लॉगिन बटन था (जो शीर्षक या नाम था)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^