2013-02-01 38 views
6

दोहराने से पहले देरी करता है मेरे पास एक गेंद छवि है जिसे मैं पथ के चारों ओर एनिमेट कर रहा हूं। एनीमेशन हमेशा के लिए दोहराने के लिए सेट है, लेकिन दोहराने के बीच देरी क्यों है?CAKeyFrameAnimation

CGPathRef aPath; 
aPath = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, SIZE, SIZE), NULL); 

[CATransaction begin]; 

arcAnimation = [CAKeyframeAnimation animationWithKeyPath: @"position"]; 
[arcAnimation setBeginTime:CACurrentMediaTime()]; 
[arcAnimation setDuration: 1.5]; 
[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 
[arcAnimation setAutoreverses: NO]; 
[arcAnimation setRepeatCount:HUGE_VALF]; 
arcAnimation.removedOnCompletion = NO; 
arcAnimation.fillMode = kCAFillModeRemoved; 
[arcAnimation setPath: aPath]; 
[ball.layer addAnimation: arcAnimation forKey: @"position"]; 
[CATransaction commit]; 
CFRelease(aPath); 

उत्तर

9

इस प्रयास करें:

[animation setCalculationMode:kCAAnimationPaced] 
+0

हां, यह एक आकर्षण की तरह काम करता है! धन्यवाद! –

+0

यह पता लगाने की कोशिश कर रहे एक घंटे बिताएं ... यह डिफ़ॉल्ट क्यों नहीं होगा ?! – cph2117

0

आप kCAFillModeForwards या कुछ अन्य मूल्य के साथ kCAFillModeRemoved बदलना होगा:

यहाँ मेरी कोड है। प्रलेखन on why पढ़ें।

इसके अतिरिक्त

:

बदलें:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]] 

(अपने परीक्षण के परिणाम पर निर्भर करता है) के साथ:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]] 

या

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]] 
+0

नीरव, मैं निश्चित रूप से नहीं में या बाहर को कम करना चाहते हैं। मैं एनीमेशन को तेजी से या धीमा किए बिना सर्कल के माध्यम से निरंतर गति से दौड़ना चाहता हूं। मैंने सभी अलग-अलग भरने के तरीकों की कोशिश की है, एनीमेशन पर कोई भी ध्यान देने योग्य प्रभाव नहीं है। फिर से शुरू होने से पहले एनीमेशन अंत में एक पल के लिए रुक जाता है। –

+0

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

+0

मैंने इसे हटा दिया है। अभी भी वही व्यवहार करता है। –

1

मैं वास्तविक पता नहीं है जवाब, लेकिन आप कर रहे हैं यहां बहुत सारी अनावश्यक चीजें हैं, और मेरा सुझाव यह होगा कि आप इसे हटाकर शुरू करें। CATRansaction ब्लॉक (begin और commit) की कोई आवश्यकता नहीं है। setBeginTime: के लिए कोई आवश्यकता नहीं है। निश्चित रूप से removedOnCompletion और fillMode सेट करने की आवश्यकता नहीं है, क्योंकि यह समूहबद्ध एनीमेशन नहीं है। बस परत में एनीमेशन जोड़ें और वापस खड़े हो जाओ। यह तुरंत शुरू होगा और हमेशा के लिए दोहराएगा, और आपका कोड सरल और बेहतर होगा।