2011-01-20 9 views
22

हर कोई और प्रत्येक पुस्तक का दावा है कि कैलियर में निहित एनिमेशन हो रहे हैं। हालांकि, हर बार जब मैं इसे सत्यापित करना चाहता था, तो मैं सेट मूल्य पर हार्ड-स्नैप के साथ समाप्त होता हूं। बिल्कुल कोई एनीमेशन नहीं।आईओएस में वास्तव में निहित एनिमेशन कब होते हैं?

यहां एक परियोजना में एक उदाहरण है जहां कुछ और नहीं हो रहा है। मैं बस एक दृश्य बना रहा हूं, फिर इसे कैलियर उदाहरण प्राप्त करें और कुछ ऐसा करें जो पूर्ण रूप से एनिमेटेड होना चाहिए।

[theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"]; 

एक और एक:

CGRect currentBounds = theLayer.bounds; 
currentBounds.size.width += 120.f; 
[self.animatedLayer setBounds:currentBounds]; 

दृश्य निश्चित रूप से कुछ सामान शामिल है तो मैं परिवर्तन देख सकते हैं। मुझे दृश्य परिवर्तन दिखाई देता है, लेकिन एक कठिन तस्वीर के रूप में। बिल्कुल कोई एनीमेशन नहीं।

तो या तो उन सभी पुस्तकों में गलत हैं और कोर एनीमेशन और निहित एनिमेशन के बारे में लिखते समय पुराने मैक ओएस एक्स ज्ञान को ध्यान में रखते हैं, या मैं कुछ गलत कर रहा हूं। क्या कोई एक कामकाजी उदाहरण प्रदान कर सकता है जो आईफोन पर निहित एनिमेशन दिखाता है?

उत्तर

65

UIKit निहित एनिमेशन अक्षम करता है। अधिक विशिष्ट होने के लिए, UIView से जुड़े एक कैलियर कभी भी अनुमानित रूप से एनिमेट नहीं करेगा। कैलियर जो आप स्वयं बनाते हैं और जो UIView से जुड़े नहीं हैं, वे सामान्य अंतर्निहित एनीमेशन मशीनरी में खरीद लेंगे।

यदि आप रुचि रखते हैं कि यह कैसे काम करता है, तो सामान्य एनिमेशन के बाद निहित एनिमेशन होते हैं: लुककी: लुकअप। यदि किसी दिए गए संपत्ति के लिए सीएएक्शन है, तो इसका उपयोग किया जाता है। अन्यथा, निहित एनीमेशन का उपयोग किया जाता है। UIView से जुड़े कैलियर के मामले में, UIView -actionForLayer:forKey: प्रतिनिधि विधि लागू करता है, और जब UIView एनीमेशन ब्लॉक में नहीं होता है तो यह इंगित करने के लिए कि यह क्रिया दृश्य यहां बंद होना चाहिए, यह हमेशा [NSNull null] देता है। यह काम करने से निहित एनिमेशन को रोकता है। UIView एनीमेशन ब्लॉक के अंदर, यह वर्तमान UIView एनीमेशन सेटिंग्स का प्रतिनिधित्व करने के लिए अपनी स्वयं की कार्रवाई बनाता है। फिर, यह निहित एनिमेशन को रोकता है।

यदि आपको CALayer गुणों को एनिमेट करने की आवश्यकता है जो UIView आपके लिए नहीं करेंगे, तो आप एक स्पष्ट CAAnimation subclass (जैसे CABasicAnimation) का उपयोग कर सकते हैं।

+1

महान जवाब! मैं उत्सुक हूं - आपने यह सारी विस्तृत जानकारी कहां प्राप्त की? मैंने इतनी सारी किताबें और स्रोतों की जांच की लेकिन इन विवरणों की कमी है। –

+0

अधिकतर परीक्षण और त्रुटि। यदि आप UIView उपclass पर '-actionForLayer: forKey: 'को ओवरराइड करते हैं, तो आप कॉल के परिणामों को सुपर से लॉग आउट कर सकते हैं और यह सक्रिय कर सकते हैं कि सक्रिय एनीमेशन ब्लॉक है या नहीं। यदि आप इसके बारे में सोचते हैं तो यह भी समझ में आता है - UIView कैलियर का प्रतिनिधि है, और '-क्शनफॉरलायर: forKey:' यदि आप निहित एनिमेशन अक्षम करना चाहते हैं तो इसमें हुक करने के लिए उपयुक्त जगह है। –

+0

बहुत समझ में आता है। धन्यवाद! –

0

आप लेयर के प्रतिनिधि को अपनी ऑब्जेक्ट पर भी सेट कर सकते हैं और हैंडल -एक्शनफॉरलेयर: के लिए:। ऐसा लगता है कि यदि आप प्रतिनिधि लागू नहीं करते हैं तो भी आपको अंतर्निहित एनीमेशन मिलता है -क्शनफॉरलेयर: के लिए:।

2

पुरानी पोस्ट, लेकिन नीचे कोर लिंक एनीमेशन प्रोग्रामिंग गाइड में एक सेक्शन के लिए लिंक करें जो केविन बल्लार्ड क्या कह रहा था उस पर कुछ और प्रकाश डालने में मदद करता है। वास्तव में एक स्पष्ट नोट होना आवश्यक है जो उल्लेख करता है कि UIView के अंतर्निहित परत गुणों को एनिमेट करने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि आप परत के प्रतिनिधि को एक उदाहरण में सेट करें जो "actionForLayer: ForKey:" विधि को अपनाने और शून्य लौटाएगा। यह पाया गया है कि आप प्रतिनिधि को एक ऐसे उदाहरण में भी सेट कर सकते हैं जो इस विधि को अपना नहीं लेता है और यह अभी भी निहित एनिमेशन की अनुमति देता है, लेकिन यह एक बेवकूफ और भ्रमित अभ्यास है।

Core Animation - Layer Actions - Defined Search Pattern for Action Keys

1

ध्यान रखें कि एक UIView के प्राथमिक परत की sublayers है आम तौर पर अपनी प्रतिनिधि के रूप में UIView नहीं रखें। इसलिए, वे निहित एनीमेशन में भाग लेते हैं जबतक कि आप इसे स्पष्ट रूप से अवरुद्ध नहीं करते हैं, भले ही आपने कार्रवाई के जवाब में एक शून्य कार्रवाई वापस करने के लिए एक प्रतिनिधि प्रदान नहीं किया है: forKey:।

तो, सामान्य दृश्य में अंतर्निहित एनीमेशन प्राप्त करने का एक आसान तरीका केवल एक उपन्यास जोड़ने वाला है जो प्राथमिक परत को कवर करता है।

मैट Neuberg की किताब प्रोग्रामिंग आईओएस 5 (पर सफारी पुस्तकें ऑनलाइन बीटा में) बहुत स्पष्ट रूप से इस विषय बताते हैं।

1

यह केविन Ballard के जवाब के बिल्कुल सही है। मैं यहां कुछ और प्रदान करना चाहता हूं।

official document

से विवरण जानकारी नामक एक अनुभाग है: आईओएस में परतें को संशोधित करने के लिए नियम, और आप

मिलेगा UIView वर्ग डिफ़ॉल्ट रूप से परत एनिमेशन अक्षम कर देता है, लेकिन उनमें एनीमेशन अंदर reenables ब्लॉक।

UIView एनीमेशन ब्लॉक में अंतर्निहित को सक्षम करने के अलावा। दो अन्य समाधान हैं:

  1. उस परत को बनाएं जिसे आपको एनीमेशन को दृश्य के एक उपन्यास की आवश्यकता है। [उत्तर] [2]

    [2]: Implicit property animations do not work with CAReplicatorLayer? लागू एनीमेशन फीड-इन का काम नहीं कर रहा है। मैंने कोशिश की, यह उम्मीद के रूप में काम किया।

  2. परत के प्रतिनिधि को परत पर ही असाइन करें। आईओएस में परत का डिफ़ॉल्ट प्रतिनिधि इसका बैकिंग स्टोर व्यू है जो परत के निहित एनीमेशन को अक्षम करने के लिए actionForLayer: (id) परत के लिए: (एनएसएसटींग *) कुंजी और [NSNull null] को वापस करता है।
0

वास्तव में, आप केवल कैल की डिफ़ॉल्ट एनीमेशन प्राप्त करने के लिए शून्य वापस कर सकते हैं।

  • (आईडी) actionForLayer: (CALayer *) परत forKey: (NSString *) घटना { वापसी नहीं के बराबर; }
+0

/* यदि परिभाषित किया गया है, * -actionForKey: विधि के डिफ़ॉल्ट कार्यान्वयन द्वारा बुलाया गया है। * CAAction प्रोटोकॉल को लागू करने वाली ऑब्जेक्ट को वापस करना चाहिए। यदि प्रतिनिधि वर्तमान घटना के लिए * निर्दिष्ट नहीं करता है तो 'शून्य' वापस आ सकता है।शून्य ऑब्जेक्ट को लौटाना (यानी * '[NSNull null]') स्पष्ट रूप से आगे की खोज को मजबूर नहीं करता है। (यानी * + defaultActionForKey: विधि नहीं कहा जाएगा।) * / – dongxin

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