2012-04-15 16 views
7

मैंने 2 NSAnimation अन्य दृश्यों के साथ दृश्य को फ़्लिप करने की वस्तुओं को बनाया। मैं इन एनिमेशन को एक साथ चलाने के लिए चाहता हूँ। मैं NSViewAnimation का उपयोग नहीं कर सकता, क्योंकि अब यह किसी भी दृश्य गुण को एनिमेट करने के बारे में है।एक साथ 2 एनएसएनीमेशन वस्तुओं को चलाने का कोई तरीका है?

self.animation = [[[TransitionAnimation alloc] initWithDuration:1.0 animationCurve:NSAnimationEaseInOut] autorelease]; 
[self.animation setDelegate:delegate]; 
[self.animation setCurrentProgress:0.0]; 

[self.animation startAnimation]; 

2 एनिमेशन जोड़ने की कोशिश की, लेकिन शायद यह किसी कारण के लिए काम नहीं किया:

यहाँ एनीमेशन रचना है। Apple developer site

NSAnimation वस्तु को विन्यस्त NSAnimationNonblocking उपयोग करने के लिए किसी भी एनीमेशन प्रदर्शित नहीं करता है ...

संपादित करें: मैं से एक उदाहरण ले लिया दूसरा एनीमेशन वास्तव में पहले एक के रूप में ही है और में बनाया है वही जगह जो पहली बार बनाई गई है।

- (void)setCurrentProgress:(NSAnimationProgress)progress { 
    [super setCurrentProgress:progress]; 
    [(NSView *)[self delegate] display];  
} 

delegate इस मामले है, जो अपनी drawRect समारोह में लागू होता है में NSView है एक समय पर निर्भर एक CIImage पर CIFilter:

TransitionAnimationNSAnimation, जहां setCurrentProgress कि तरह लग रहा है की एक उपवर्ग है। समस्या यह है कि यह तुल्यकालिक चलाता है और दूसरा एनीमेशन पहले के अंत के ठीक बाद शुरू होता है। क्या उन्हें एक साथ चलाने का कोई तरीका है?

+1

कहाँ दूसरा एनीमेशन है? और चीजों ने किस तरह काम नहीं किया? –

उत्तर

17

NSAnimation वास्तव में कई ऑब्जेक्ट्स और उनके गुणों को एनिमेट करने के लिए सबसे अच्छा विकल्प नहीं है।

इसके बजाय, आपको अपने विचार NSAnimatablePropertyContainer प्रोटोकॉल के अनुरूप बनाना चाहिए।

इसके बाद आप कई कस्टम गुण animatable के रूप में (पहले से ही NSView द्वारा समर्थित गुण के अलावा) सेट कर सकते हैं, और फिर आप बस गुण चेतन करने के लिए अपने विचार 'animator प्रॉक्सी का उपयोग कर सकते हैं:

yourObject.animator.propertyName = finalPropertyValue; 

अलावा

[NSAnimationContext beginGrouping]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

तुम भी अवधि निर्धारित कर सकते हैं और एक पूर्णता हैंडलर blo की आपूर्ति: एनीमेशन बहुत सरल बनाने से, यह भी आप एक साथ उपयोग कर एक NSAnimationContext से अधिक ऑब्जेक्ट चेतन करने की अनुमति देता सी.के.:

[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:0.5]; 
[[NSAnimationContext currentContext] setCompletionHandler:^{ 
    NSLog(@"animation finished"); 
}]; 
firstObject.animator.propertyName = finalPropertyValue1; 
secondObject.animator.propertyName = finalPropertyValue2; 
[NSAnimationContext endGrouping]; 

NSAnimation और NSViewAnimation कक्षाएं एनिमेटर प्रॉक्सी समर्थन की तुलना में बहुत पुराने हैं और मैं अत्यधिक सुझाव है कि आप उन लोगों से दूर ले जाते हैं यदि संभव हो तो। NSAnimatablePropertyContainer प्रोटोकॉल का समर्थन सभी NSAnimation प्रतिनिधि सामग्री के प्रबंधन से आसान है। कस्टम टाइम फ़ंक्शंस और समापन हैंडलर के लिए शेर समर्थन का अर्थ है कि वास्तव में ऐसा करने की कोई ज़रूरत नहीं है।

//declare the default animations for any keys we want to animate 
+ (id)defaultAnimationForKey:(NSString *)key 
{ 
    //in this case, we want to add animation for our x and y keys 
    if ([key isEqualToString:@"x"] || [key isEqualToString:@"y"]) { 
     return [CABasicAnimation animation]; 
    } else { 
     // Defer to super's implementation for any keys we don't specifically handle. 
     return [super defaultAnimationForKey:key]; 
    } 
} 

:

एक मानक NSView वस्तु के लिए, आप अपने दृश्य में एक संपत्ति के लिए एनीमेशन समर्थन जोड़ना चाहते हैं, तो आप सिर्फ अपने ध्यान में रखते हुए +defaultAnimationForKey: विधि ओवरराइड और संपत्ति के लिए एक एनीमेशन वापस जाने के लिए की जरूरत है मैं एक साधारण sample project बना लिया है पता चलता है कि कैसे एक साथ NSAnimatablePropertyContainer प्रोटोकॉल का उपयोग कर एक देखने के कई गुण चेतन करने के लिए।

सभी आपके विचार सफलतापूर्वक अद्यतन करने के लिए क्या करने की जरूरत सुनिश्चित करें कि setNeedsDisplay:YES जब animatable गुण के किसी भी संशोधित कर रहे हैं कहा जाता है बनाते हैं। फिर आप अपने drawRect: विधि में उन गुणों के मान प्राप्त कर सकते हैं और उन मानों के आधार पर एनीमेशन अपडेट कर सकते हैं।

आप एक सरल प्रगति मूल्य है कि जिस तरह से चीजें NSAnimation के साथ काम के अनुरूप है चाहते हैं, आप अपने दृश्य पर एक progress संपत्ति निर्धारित कर सकते हैं और फिर कुछ इस तरह करते हैं: आप तो self.progress उपयोग कर सकते हैं

yourView.progress = 0; 
[yourView.animator setProgress:1.0]; 

एनीमेशन के वर्तमान मूल्य को जानने के लिए अपने drawRect: विधि में।

+0

बहुत बहुत धन्यवाद! मुझे इस बारे में पता नहीं था। किसी भी तरह से मैं Google खोज में नहीं पहुंच पाया। कोशिश करेंगे और आपको बताएंगे। –

+0

मैं सिर्फ उत्सुक हूं: यदि हमारे पास एनएसएनीमेशन के साथ प्रदर्शन (कम फ्रेम दर) समस्याएं हैं, तो इस प्रोटोकॉल को लागू करने में संभवतः मदद मिलेगी? – Zakman411

+0

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