2010-09-22 12 views
8

हम जानते हैं कि UIImageView छवि अनुक्रम एनीमेशन के लिए बहुत अच्छा समर्थन है। हम आसानी से UIImage ऑब्जेक्ट्स की एक सरणी बना सकते हैं, animationImages प्रॉपर्टी सेट करें, एनीमेशन अवधि कॉन्फ़िगर करें, गिनती दोहराएं आदि और फिर बस आग लगाएं। लेकिन यह एनीमेशन खत्म होने पर यह जानने का कोई तरीका नहीं है।आईफोन: UIImageView छवि अनुक्रम एनीमेशन के अंत का पता लगाने का सबसे अच्छा तरीका

कहें कि मेरे पास दस छवियां हैं और फिर मैं उनके साथ एक एनीमेशन (दोहराना = 1) दोहराना चाहता हूं। और जब एनीमेशन खत्म हो गया है, तो मैं कुछ अन्य कोड चलाने के लिए चाहता हूं। यह जानने का सबसे अच्छा तरीका क्या है कि एनीमेशन समाप्त हो गया है?

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

तो मेरा सवाल यह है कि क्या यह जानने का कोई बेहतर तरीका है कि UIImageView छवि अनुक्रम एनीमेशन टाइमर का उपयोग किये बिना समाप्त हो गया है?

कोड इस

 
myImageView.animationImages = images; // images is a NSArray of UIImages 
myImageView.animationDuration = 2.0; 
myImageView.animationRepeatCount = 1; 

[myImageView startAnimating] 
+0

कुछ नमूना कोड – taskinoor

+1

के साथ संपादित किया गया है क्या आपने वास्तव में टाइमर का उपयोग करने का प्रयास किया है? यह सच है कि समय 100% सटीक नहीं है लेकिन AFAIK आप अन्य एनिमेशन के समय पर भरोसा नहीं कर सकते हैं। अगर मैं अंतर्निहित UIImageView एनीमेशन टाइमर का उपयोग करता हूं तो मुझे आश्चर्य नहीं होगा। –

+0

या मैंने टाइमर की कोशिश की है। असल में यह वही है जो मैं अभी उपयोग कर रहा हूं। यह कई मामलों के लिए ठीक है, लेकिन अच्छी तरह से ... 100% नहीं :-) – taskinoor

उत्तर

8

की तरह कुछ UIImageView पर isAnimating संपत्ति NO जब यह एनिमेट किया है जाना चाहिए। यह एक औपचारिक संपत्ति नहीं है, हालांकि, आप इस पर अवलोकन स्थापित नहीं कर सकते हैं। आप इसे एक दानेदार टाइमर पर मतदान कर सकते हैं (जैसे CADisplayLink)।

इसके लिए कोई "एनीमेशन पूर्ण" प्रतिनिधि नहीं है, अगर यह ऐसी चीज है जिसे आप ढूंढ रहे हैं। समय छवियों, आदि के लोडिंग विलंब के आधार पर परिवर्तनीय हो सकता है, और नहीं, यह सुनिश्चित करने के लिए निश्चित रूप से जानने का कोई निश्चित तरीका नहीं है।

UIImageView पर छवि एनीमेशन सामग्री एक सुविधा है, और गंभीर एनीमेशन काम करने के लिए पर्याप्त वजन नहीं है। अगर आपको उस तरह की परिशुद्धता की आवश्यकता है तो खुद को रोल करने पर विचार करें।

+0

या, मुझे यह भी लगता है कि आखिर में मुझे इसे अपने आप संभालने की ज़रूरत है। बस यह सुनिश्चित करना चाहता था कि मुझे कुछ भी याद न हो और कोई वैकल्पिक तरीका न हो। – taskinoor

+0

सुनिश्चित नहीं है कि आप "औपचारिक संपत्ति" से क्या मतलब रखते हैं। यह निश्चित रूप से एक संपत्ति है, लेकिन UIImageView शायद सेटर को कॉल नहीं करता है (मुझे संदेह है कि कोई नहीं है)। –

1

मैंने इसे बनाया (मेरे UIImageView सबक्लास का तरीका)।

-(void)startAnimatingWithCallback:(UIImageViewAnimationCompletitionBlock) completitionCallback 
{ 
    [self startAnimating]; 

    dispatch_queue_t animatingQueue = dispatch_get_current_queue(); 
    dispatch_queue_t pollingQueue = dispatch_queue_create("pollingQueue", NULL); 
    dispatch_async(pollingQueue, ^{ 

     while(self.isAnimating) { usleep(10000); } 
     dispatch_async(animatingQueue, ^{ if (completitionCallback) completitionCallback(); }); 

    }); 
} 

सरल उपयोग: (संपत्ति image)

[self.oneView fadeOut]; 
[self.otherView startAnimatingWithCallback:^ 
{ 
    [self.oneView fadeIn]; 
}]; 
+0

सबसे खराब हैक में से एक: जबकि लूप एक सीपीयू (100% तक) को हॉग करेगा और बैटरी को तुरंत हटा देगा। – CouchDeveloper

+0

याप वास्तव में पृष्ठभूमि में भी "अंतहीन" लूप सबसे अच्छा विचार नहीं है। यह वैसे भी निर्भर करता है, मैंने वास्तव में केवल सेकंड के मामले के लिए इसका उपयोग किया है। – Geri

+1

समस्या को कम करने के लिए आप 'नींद (10000);' जोड़ सकते हैं। अन्यथा, आप सेब उपकरणों पर बैटरी समस्याओं का कारण बनने के लिए जिम्मेदार होने का जोखिम लेते हैं: पी – CouchDeveloper

0

इसके अलावा मैं UIImageView की डिफ़ॉल्ट छवि सेट करने की अनुशंसा कर सकता है एनीमेशन का पहला फ्रेम पर और सिर्फ एनीमेशन शुरू करने के बाद अंतिम फ्रेम करने के लिए इसे बदलने (startAnimating विधि)। इस तरह हम बदसूरत ब्लिक से बचते हैं जो एनीमेशन समाप्त होने पर हो सकता है लेकिन कॉलबैक नहीं लगाया जाता है।