2009-09-04 18 views
39

पर वापस कूदता है मैं एक गिरने वाला सिक्का बनाने की कोशिश कर रहा हूं। सिक्का छवि एक कैलियर है जिसमें 2 CABasicAnimimations - एक गिरने और एक घूर्णन एक है। जब गिरने वाली एनीमेशन खत्म हो जाती है, तो वह वहां रहता है। रोटेशन एनीमेशन हालांकि, जिसे यादृच्छिक माना जाता है और हर बार एक अलग कोण में समाप्त होता है, बस मूल CALAyer छवि पर वापस आ जाता है।CABasicAnimation का उपयोग कर एक कैलियर घुमाए जाने के बाद परत परत की अप्रत्याशित स्थिति

मैं इसे एनीमेशन समाप्त करने वाले कोण में रहना चाहता हूं। क्या यह संभव है? मैं यह कैसे करुं?

कोड:

//Moving down animation: 
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
anim.duration = 1; 
anim.autoreverses = NO; 
anim.removedOnCompletion = YES; 

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)]; 
anim.toValue = [NSNumber numberWithInt: 0]; 

//Rotation Animation: 
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
rota.duration = 4; 
rota.autoreverses = NO; 
rota.removedOnCompletion = NO; 
rota.fromValue = [NSNumber numberWithFloat: 0]; 
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ]; 
[cl addAnimation: rota forKey: @"rotation"]; 
[cl addAnimation: anim forKey: @"animateFalling"]; 

उत्तर

79

आप नहीं करने के लिए रोटेशन एनीमेशन का removedOnCompletion गुण सेट है, उदाहरण के लिए,

rota.removedOnCompletion = NO; 

कि प्रस्तुति परत जब एनीमेशन समाप्त हो गया है, जहां यह था छोड़ देना चाहिए। डिफ़ॉल्ट हां है, जो मॉडल मान पर वापस आ जाएगा, यानी, आपके द्वारा वर्णित व्यवहार।

fillMode भी सेट किया जाना चाहिए, यानी,

rota.fillMode = kCAFillModeForwards; 
+0

मैंने किया। मैंने कोड में इस्तेमाल किया कोड मैंने जोड़ा। – Mikle

+9

fillMode चीज इसे हल किया। भगवान जानता है कि इसकी आवश्यकता क्यों है :) – Mikle

+0

@Allan कोई विचार क्यों 'fillMode' को' kCAFillModeForwards' पर सेट करने की आवश्यकता है? – pixelfreak

1

मैंने पाया कि निर्धारित करके: removedOnCompletion = NO;

उपकरणों में एक दृश्य रिसाव का उत्पादन नहीं किया, लेकिन deallocated नहीं मिला और एक छोटे से जमा किया गया था स्मृति की मात्रा। आईडीके अगर यह मेरा कार्यान्वयन या क्या है, लेकिन एनीमेशन के अंत में हटाए गए सभी एनीमेशन को जोड़कर अवशिष्ट स्मृति के इस छोटे से बिट को साफ़ करना प्रतीत होता है।

[myview.layer removeAllAnimations]; 
+0

क्या यह सिम्युलेटर या डिवाइस पर है? – Pablo

+0

हाँ अच्छा बिंदु, यह सिम्युलेटर पर था, और मैंने डिवाइस पर कोशिश नहीं की, जो स्पष्ट रूप से असली सौदा है। यह एक बहुत ही छोटी वृद्धि थी। लेकिन, मुझे यह कारण मिला कि मैं उपकरणों का उपयोग करके एक और रिसाव के लिए शिकार कर रहा था और मैं अजीब स्मृति व्यवहार देख रहा था। ऐसा करने से मुझे सच रिसाव अलग कर दिया गया था, और मैं छेद को प्लग करने में सक्षम था। नोट यह xcode 3.2.4 है और इसके बाद, मुझे लगातार प्रारंभिक संख्या में लौटने की याद आती है- जो अच्छा लगता है। – yeahdixon

+1

आप प्रस्तुति परत एनिमेट कर रहे हैं। फिर आपको मॉडल परत की 'ट्रांसफॉर्म' प्रॉपर्टी को अंतिम मान पर सेट करना चाहिए, लेकिन इसके बजाय आप प्रस्तुति परत को 'हटाए गए अपूर्ण = NO' के साथ संरक्षित करते हैं, इस प्रकार, इसके बजाय दो परतों के साथ समाप्त होता है। यही कारण है कि आप स्मृति की वृद्धि देखते हैं। – Jano

4

मैं ट्विटर/फेसबुक "रीफ्रेश करने के लिए खींचें" प्रभाव की तरह आगे एक तीर घुमाने की कोशिश कर रहा था।

समस्या है, मैं रोटेशन आगे और पीछे एक ही UIView पर कर रहा था, तो

rotation.removedOnCompletion = NO; 
rotation.fillMode = kCAFillModeForwards; 

आगे एनीमेशन युद्ध जोड़ने ठीक काम कर रहा है, लेकिन पीछे की ओर एनीमेशन बिल्कुल काम नहीं कर रहा था के बाद।

तो मैं अंतिम पंक्ति yeahdixon ने सुझाव दिया जोड़ा, और इसके अलावा में देखने के एनीमेशन का पूरा राज्य को बदलने के लिए सेट: (180 डिग्री से रोटेशन)

[myview.layer removeAllAnimations]; 
myView.transform = CGAffineTransformMakeRotation(M_PI); 

एनीमेशन 'बहाल' (पीछे की ओर) मैं के लिए इसे पूरा करने पर करें:

myView.transform = CGAffineTransformMakeRotation(0); 

... और यह ठीक काम करता है। किसी भी तरह इसे हटाने के लिए सभी कॉल कॉल की आवश्यकता नहीं है।

+0

पुराने उत्तरों को वापस खोदना, लेकिन 'removeAllAnimations' चीज़ के लिए +1। इससे मेरा झटका लगा। – Cyrille