2012-06-26 51 views
5

मेरे एप्लिकेशन में मैं एनीमेशन के लिए CABasicAnimation का उपयोग कर रहा हूं। मैं गतिशील रूप से एनीमेशन की गति को बदलना चाहता हूं इसलिए मैंने गति को बदलने के लिए एक स्लाइडर जोड़ा है। मेरा एनीमेशन कोड निम्नलिखित है। लेकिन मैं गति को बदलने में सक्षम नहीं हूं, जब मैं गति के मूल्य को बदलता हूं तो कुछ भी नहीं होता है।एनीमेशन CABasicAnimation

 CABasicAnimation * a = [CABasicAnimation animationWithKeyPath:@"position"]; 
    [a setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 

    CGPoint startPt = CGPointMake(self.view.bounds.size.width + displayLabel.bounds.size.width/2, 
            displayLabel.frame.origin.y); 
    CGPoint endPt = CGPointMake(displayLabel.bounds.size.width/-2, displayLabel.frame.origin.y); 

    [a setFromValue:[NSValue valueWithCGPoint:startPt]]; 
    [a setToValue:[NSValue valueWithCGPoint:endPt]]; 
    [a setAutoreverses:NO]; 
    [a setDuration:speeds]; 
    [a setRepeatCount:HUGE_VAL]; 
    [displayLabel.layer addAnimation:a forKey:@"rotationAnimation"]; 


    - (IBAction)speedSlider:(id)sender { 

     speeds = slider.value; 

    } 
+0

[एक चल एनीमेशन पर बदलें अवधि (गति)] के संभावित डुप्लिकेट (https://stackoverflow.com/questions/21589483/change-duration-speed-on-a-running-animation) – Fattie

+0

** पूर्ण समाधान 2017 ** के लिए ...https://stackoverflow.com/a/45787919/294884, phew – Fattie

उत्तर

0

आपको जितनी आवश्यकता हो उतनी गति निर्धारित करें।

a.duration=0.5; 

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

+0

मैं स्लाइडर मान के आधार पर गतिशील गति चाहता हूं। स्थिर मूल्यों के लिए एनिमेशन पूरी तरह से ठीक है –

2

संपादित करें: ऐसा लगता है कि आप एक और समस्या है, हालांकि होगा: यह नहीं look like आप एक चल एनीमेशन पर ऐसे ही मूल्यों को बदल सकते है। आपको वर्तमान एनीमेशन को हटाना होगा और बदले गए मूल्य के साथ एक नया जोड़ना होगा। जब आप नई एनीमेशन जोड़ते हैं तो इसे झटकेदार प्रभाव को रोकने के लिए थोड़ी सावधानी की आवश्यकता हो सकती है।

उपरोक्त धागे से, आप एनीमेशन दोहराने से ऐसा करने में सक्षम हो सकते हैं, लेकिन एनीमेशन को दोबारा जोड़ने के लिए एक प्रतिनिधि (see here) का उपयोग करके और अगले एनीमेशन चक्र के लिए नई गति को सेट करने के लिए।

मूल पोस्ट:

आप मूल्य है कि आप मूल रूप से एनीमेशन के लिए पारित किया था बदल रहे हैं। यह चल रहे एनीमेशन को प्रभावित नहीं करेगा। आपको इसका संदर्भ प्राप्त करने की आवश्यकता होगी, और एनीमेशन ऑब्जेक्ट की अवधि संपत्ति को बदलना होगा। अपनी कार्रवाई विधि में कुछ इस तरह:

CABasicAnimation *a = [displayLabel.layer animationForKey:@"rotationAnimation"]; 
a.duration = slider.value; 
+0

उपरोक्त कोड से कुछ भी नहीं होता है। –

+0

मैंने इसे थोड़ा और देखा है और आप चल रहे एनीमेशन के मूल्य को नहीं बदल सकते हैं। मेरे संपादन – jrturton

+0

यहां देखें कि आप इन दिनों ** पुन: प्रारंभ करने योग्य एनीमेशन ** कैसे करते हैं ** https://stackoverflow.com/a/45787919/294884 – Fattie

1

मुझे लगता है कि jrturton सही है कि आप पहले से चल रहे एनीमेशन पर गुणों को नहीं बदल सकते हैं। लेकिन आप क्या कर सकते हैं एनीमेशन को छोटे सेगमेंट में तोड़ना है और स्लाइडर वैल्यू बदलते समय अगले सेगमेंट के लिए गति बदलना है।

बिंदु ए से बिंदु डी को एनिमेट करने के बजाय, आप ए-बी, फिर बी-सी, फिर सी-डी से एनिमेट करेंगे। वर्तमान बिंदु की जांच करने के लिए अभिभावक वर्ग की एनीमेशनडिडटॉप का उपयोग करें, स्लाइडर मान की जांच करें, और अगली एनीमेशन को बंद करें।

यह झटकेदार गति उत्पन्न कर सकता है, लेकिन यदि आप बहुत छोटे सेगमेंट का उपयोग करते हैं, तो आप इसे आसानी से सुलझाने में सक्षम हो सकते हैं।

1

यू एनीमेशन बंद कर देना चाहिए और एक नया अवधि समय

के साथ एक नया पुनः आरंभ लेकिन fromValue और toValue नीचे लॉग इन करने की याद है, और एक सहज परिवर्तन

6
प्रदर्शन करने के लिए नई fromValue के रूप में वर्ष toValue का उपयोग

मुझे लगता है कि गति को बदलने के लिए सबसे अच्छा तरीका बदलने के अपने परत के समय प्रणाली

displayLabel.layer.timeOffset = 
    [displayLabel.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 
displayLabel.layer.beginTime = CACurrentMediaTime(); 
displayLabel.layer.speed= slider.value; 

आप अग्रिम के लिए यह देख सकते है। https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW2

+0

यह काम नहीं करता है; वह असंबंधित है। – Fattie

+0

@ फ़ैटी - शायद आप कुछ अलग खोज रहे हैं। यह समस्या के लिए सटीक और सटीक उत्तर है। यह मेरे लिए खूबसूरती से काम करता है। –

+0

मैं समझता हूं कि आपका मतलब क्या है @ लेस्नी - और हाँ यह कुछ स्थितियों में समाधान प्रदान करेगा। हालांकि, यह पूरे परत के लिए समय पैमाने बदलता है। चल रहे एनीमेशन के गुणों को बदलने की आवश्यकता एक आम समस्या है (और आईओएस में परेशान करना मुश्किल है)। मैंने आपके उत्तर पर "+1" पर क्लिक किया :) नया साल मुबारक हो! – Fattie