2011-04-02 14 views
36

क्या यह बताने का कोई तरीका है कि कोई UIView एनीमेशन के बीच में है या नहीं? जब मैं दृश्य वस्तु का प्रिंट आउट, जबकि यह बढ़ रहा है मैं नोटिस एक "एनिमेशन" प्रविष्टि है कि वहाँ:परीक्षण करें कि क्या UIView एनीमेशन के बीच में है

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; animations = { position=<CABasicAnimation: 0x6a69c40>; bounds=<CABasicAnimation: 0x6a6d4d0>; }; layer = <CALayer: 0x2e6e00>> 

जब एनीमेशन बंद कर दिया है और मैं दृश्य प्रिंट, "एनिमेशन" प्रविष्टि अब चला गया है:

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; layer = <CALayer: 0x2e6e00>> 

उत्तर

36

ए UIView में एक परत है (CALayer)। आप इसे animationKeys भेज सकते हैं जो आपको चाबियों से जुड़ी एनिमेशन की पहचान करने वाली कुंजी की एक सरणी देगा। मुझे लगता है कि अगर कोई प्रविष्टियां हैं, तो एनीमेशन चल रहे हैं। यदि आप गहराई से खोदना चाहते हैं तो CAMediaTiming protocol पर एक नज़र डालें, जिसे कैलियर गोद लेता है। यह वर्तमान एनीमेशन पर कुछ और जानकारी करता है।

+2

काम नहीं करता है या नहीं, ... एनीमेशनकेस सरणी हमेशा खाली होती है ... – Martin

+0

@ मार्टिन माफ करना, मैं तब नहीं बता सकता, जब मैंने जवाब दिया तो यह काम किया। शायद आईओएस 4.x के बाद कुछ बदल गया? –

+1

@ मार्टिन यह काम नहीं करता है, अगर आपने शून्य कुंजी के साथ एनीमेशन निकाल दिया है। एनीमेशनकिज़ एनिमेशन की सरणी नहीं है, लेकिन उनकी चाबियों की सरणी है। –

24

एनिमेशन अंतर्निहित कोर एनिमेशन CALayer वर्ग

तो मुझे लगता है के लिए वास्तव में जुड़े होते हैं तो आप सिर्फ जांच कर सकते हैं myView.layer.animationKeys

+0

एनीमेशनकिस एक विधि है। तो आपको [myView.layer एनीमेशन केज़] को कॉल करना होगा – Martin

+12

एनीमेशनकिज़ एक संदेश है, जैसे किसी भी संपत्ति एक्सेसर ... डॉट या ब्रैकेट्स, बस * शैली * का मामला है। –

+0

लेकिन एनीमेशनकेस * संपत्ति नहीं है! https://developer.apple.com/library/IOs/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html (बेशक, यह बहुत महत्वपूर्ण नहीं है :)) – Martin

5

सुझाव वहाँ animationKeys चाल के साथ एक अड़चन है प्रस्तुति परत क्वेरी सकता है।

कभी-कभी एनीमेशन पूरा होने के बाद कुछ एनीमेशन हो सकता है।

इसका मतलब है कि एक गैर-एनिमेटिंग परत एनीमेशन के सेट को वापस कर सकती है, भले ही यह वास्तव में एनिमेटिंग न हो।

आप यह सुनिश्चित कर सकते हैं कि एनीमेशन के हटाए गए एनीमेशन को हटाकर स्वचालित रूप से एनीमेशन की हटा दी जाती है।

उदा

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"aPath"]; 
animation.removedOnCompletion = YES; 

आप सभी एनिमेशन आप अपने परत करने के लिए आवेदन के लिए ऐसा करते हैं तो यह है कि जब परत एनिमेट नहीं है वहाँ कोई animationKeys मौजूद हैं सुनिश्चित करेगा।

7

मुझे इस सवाल के संदर्भ के बारे में निश्चित नहीं है, लेकिन मैं यह पता लगाने का प्रयास कर रहा था कि कोई दूसरा एनीमेशन शुरू करने से पहले एनिमेटिंग कर रहा था या नहीं। हालांकि एक UIView एनीमेशन विकल्प UIViewAnimationOptionBeginFromCurrentState है जो चिकनी उपस्थिति देने के लिए आवश्यक होने पर एनिमेशन को जोड़ देगा। इस प्रकार यह जानने के लिए मेरी आवश्यकता को खत्म कर दिया गया कि दृश्य एनिमेट कर रहा था या नहीं।

5

इनमें से कुछ मेरे लिए काम नहीं करते थे। इसका कारण यह है कि ये एनिमेशन असीमित हैं।

क्या मैं था मेरी एनीमेशन

[UIView animateWithDuration:0.25 
       animations:^{ 
        viewIsAnimating = YES; 
       } completion:^(BOOL finished) { 
        if (finished) { 
         viewIsAnimating = NO; 
        } 
       }]; 
+0

मेरा UIButtons 'एनीमेशन की संपत्ति हमेशा शून्य लौट रही थी (यहां तक ​​कि एनिमेटिंग करते समय भी), इसलिए मैं नौकरी पाने के लिए भी इस मार्ग पर गया। – vikzilla

+0

यदि मैं '.repeat 'विकल्प का उपयोग करता हूं तो क्या होगा? –

1

आईओएस 9+ विधि, में एक संपत्ति

@property BOOL viewIsAnimating; 

और परिभाषित किया गया है भी काम करता है जब layer.animationKeys कोई कुंजी शामिल हैं:

let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0 

दस्तावेज़ों से:

यह विधि केवल एक गैर-शून्य मान देता है यदि UIView एनीमेशन ब्लॉक में कहा जाता है।