2009-02-05 13 views
33

मैं कोर एनीमेशन कैलियर की पृष्ठभूमि रंग को एनिमेट करने के लिए CABasicAnimation बनाने की कोशिश कर रहा हूं, लेकिन मैं एनीमेशन को पास करने के लिए CGColorRef मान को सही तरीके से लपेटने का तरीका नहीं समझ सकता। उदाहरण के लिए:आप कैलियर की पृष्ठभूमि को स्पष्ट रूप से एनिमेट कैसे करते हैं?

CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0}; 
CGColorRef red = CGColorCreate(rgbColorspace, values); 
CGColorSpaceRelease(rgbColorspace); 

CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
[selectionAnimation setDuration:0.5f]; 
[selectionAnimation setToValue:[NSValue valueWithPointer:red]]; 
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"]; 

पृष्ठभूमि रंग संपत्ति के लिए कुछ नहीं कर रहा है, मुझे लगता है क्योंकि एक सूचक एक NSValue में लिपटे के रूप में यह सौंपने जिस तरह से यह साथ दी जाने वाली नहीं है।

पृष्ठभूमि रंगर कैलियर की एक एनिमेटेबल संपत्ति है, इसलिए मेरा सवाल है: आप इस विशेष संपत्ति (अधिमानतः मैक/आईफोन प्लेटफ़ॉर्म-स्वतंत्र तरीके से) के लिए से या मूल्यों को कैसे सेट करते हैं?

उत्तर

57

आप जब एक CABasicAnimation की toValue या fromValue गुण स्थापित करने CGColorRef रों रैप करने के लिए जरूरत नहीं है। बस CGColorRef का उपयोग करें। कंपाइलर चेतावनी से बचने के लिए, आप CGColorRef को id पर डाल सकते हैं।

मेरे नमूना ऐप में, निम्न कोड पृष्ठभूमि को लाल रंग में एनिमेटेड करता है।

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"]; 
selectionAnimation.toValue = (id)[UIColor redColor].CGColor; 
[self.view.layer addAnimation:selectionAnimation 
         forKey:@"selectionAnimation"]; 

हालांकि, जब एनीमेशन समाप्त हो जाता है, तो पृष्ठभूमि मूल रंग पर वापस आती है। ऐसा इसलिए है क्योंकि CABasicAnimation एनीमेशन चल रहा है, जबकि लक्ष्य परत की प्रेजेंटेशन परत को केवल प्रभावित करता है। एनीमेशन खत्म होने के बाद, मॉडल परत रिटर्न में निर्धारित मान। तो आपको परतों को backgroundColor संपत्ति को लाल पर भी सेट करना होगा। शायद CATransaction का उपयोग कर निहित एनिमेशन बंद करें।

आप पहली जगह में एक अंतर्निहित एनीमेशन का उपयोग करके स्वयं को इस समस्या को बचा सकते हैं।

+13

मीठे। आपको लगता है कि वे टाइपकास्ट को आईडी पर कहीं भी दस्तावेज करेंगे। हां, मैं अपने जीवन को एक निहित एनीमेशन के साथ आसान बना सकता हूं, लेकिन यह मुझे परेशान कर रहा था। इसे जारी रखने के लिए, आपको केवल एनीमेशन के fillMode को केसीएफ़िलमोड फॉरवर्ड पर सेट करना है और हटाया गया है NO को पूर्ण करने के लिए। –

+0

+1 अच्छा, एक आकर्षण की तरह काम करता है! –

+0

या आप अपने आप को समय बचा सकते हैं और फेसबुक पॉप लाइब्रेरी का उपयोग कर सकते हैं: https://github.com/facebook/pop। यहां उदाहरण: https://github.com/maxmyers/FacebookPop – Benjamin

2

मैं इस समस्या से संघर्ष कर रहा था जब तक कि मैंने प्रयोगात्मक रूप से रोडब्लॉक नहीं पाया। पृष्ठभूमि को सेट करना, परत की रंग संपत्ति, या तो सीधे या एनीमेशन के माध्यम से, यदि आप किसी आइटम (जैसे UILabel) के संदर्भ में इंटरफ़ेस बिल्डर में डिफ़ॉल्ट (अनिर्दिष्ट) से पृष्ठभूमि रंग बदलते हैं, तो इसका कोई प्रभाव नहीं पड़ेगा। आईबी में रखा गया है। तो पृष्ठभूमि रंग को निर्दिष्ट न छोड़ें और उपर्युक्त काम करना चाहिए।

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