2008-10-28 19 views
8

कोर एनिमेशन अपने CALayer आधारित कक्षा में actionForKey विधि को लागू करने से कस्टम एनिमेशन के लिए अनुमति देता है:मैं कोर एनीमेशन में ऑनऑर्डरऑट के लिए कस्टम एनीमेशन का उपयोग कैसे कर सकता हूं?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

मैं तो एक एनीमेशन बनाने और इसे onOrderIn कार्रवाई के लिए लौट सकते हैं (यानी परत एक और परत में जोड़ा जाता है जब) । यह ठीक काम करता है। यदि मैं onOrderOut (यानी परत को अपने सुपरलेयर से हटा दिया गया है) के लिए ऐसा ही करता है, तो लौटाए गए एनीमेशन को अनदेखा किया जाता है, और इसके बजाय डिफ़ॉल्ट एनीमेशन लागू होता है। ज़ूम आउट करने की नहीं है

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

काम करता है ज़ूम इन,:

मेरा लक्ष्य में परत (onOrderIn) और बाहर (onOrderOut) ज़ूम करने के लिए है। इसके बजाय डिफ़ॉल्ट फीका आउट एनीमेशन का उपयोग किया जाता है।

कोड में कुछ टाइपो हो सकते हैं, क्योंकि मैं इसे किसी अन्य मशीन पर टाइप कर रहा हूं।

क्या कोई मदद कर सकता है?

उत्तर

4

जॉन हार्पर का हवाला देते हुए quartz-dev mailing list पर:

समय एनीमेशन चलना चाहिए द्वारा की- onOrderOut के लिए किसी भी एनीमेशन लौटने के साथ एक बुनियादी समस्या नहीं है, परत नहीं रह गया पेड़ में है , इसलिए इसमें प्रभाव नहीं है। तो ऑनऑर्डरऑट एनीमेशन ट्रिगर करने के लिए उपयोगी नहीं है; परतों को पेड़ से हटा दिए जाने पर अन्य कोड चलाने के लिए उपयोगी हो सकता है।

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

आप इस के कई मामले हैं, तो यह एक आम सुपर क्लास कि एक एनीमेशन शुरू होता है लिखने के लिए आसान है वर्ग के लिए एनीमेशन प्रतिनिधि सेट और लागू + animationDidStop: w/ओ एनीमेशन सक्षम परत को हटाने के लिए। यह CoreAnimation की अग्नि-भूल-भूल प्रकृति को पुनर्स्थापित करता है जिसे आप उम्मीद करते थे कि डिफ़ॉल्ट कार्यान्वयन के साथ उपस्थित होगा।

+0

आह, धन्यवाद।मैं इसका परीक्षण करूंगा, मुझे इसका फिर से आवश्यकता होनी चाहिए, जबकि हमने क्यूटी जंबी के साथ सॉफ्टवेयर का एक पूरी तरह से अलग संस्करण लिखा था। ;) – Lemming

0

क्या आपने सत्यापित किया है कि आपकी विधि को key@"onOrderOut" के साथ बुलाया जा रहा है और यह कि आपकी विधि सही एनीमेशन लौट रही है?

+0

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