19

के साथ रोकें, मैं UIView animateWithDuration: विधि को स्थापित कर रहा हूं, जिसमें प्रोग्राम में अन्य animationOn बूल को सेट करने के इरादे से अनंत अनंत लूप दोहराना रद्द कर दिया गया है। मैं इस धारणा के तहत था कि completion ब्लॉक हर बार एनीमेशन समाप्त होने का चक्र कहा जाएगा, लेकिन यह मामला प्रतीत नहीं होता है।एक ऑटो-रिवर्स/अनंत-दोहराना UIView एनीमेशन को एक बूल/समापन ब्लॉक

क्या completion ब्लॉक को दोहराने वाली एनीमेशन में कभी भी बुलाया जाता है? और यदि नहीं, तो क्या इस तरीके से बाहर इस एनीमेशन को रोक सकता है?

- (void) animateFirst: (UIButton *) button 
{ 
    button.transform = CGAffineTransformMakeScale(1.1, 1.1); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 
         if (!animationOn) { 
          [UIView setAnimationRepeatCount: 0]; 
         } 
    }]; 
} 

उत्तर

45

समापन ब्लॉक केवल एनीमेशन बाधित होने पर ही कॉल किया जाएगा। उदाहरण के लिए जब ऐप पृष्ठभूमि में जाता है और फिर अग्रभूमि पर वापस आता है (मल्टीटास्किंग के माध्यम से)। उस मामले में एनीमेशन बंद कर दिया गया है। ऐसा होने पर आपको एनीमेशन को पुनरारंभ करना चाहिए।

एनीमेशन बंद करने के लिए आप को देखने की परत से निकाल सकते हैं:

[button.layer removeAllAnimations]; 
+0

यह काम नहीं किया, मुझे डर है। परिवर्तन में बदलाव के बाद भी एनीमेशन जा रहा है। (मैंने '.transform' को 'CGAffineTransformMakeScale (1.0, 1.0)' पर सेट किया है)। – Luke

+0

मुझे कुछ और मिला जो काम कर सकता है। मैंने अपना जवाब अपडेट किया। क्या आप कोशिश कर सकते हैं? –

+0

ओह आपने इसे स्वयं समझ लिया :) वैसे भी मेरे जवाब को स्वीकार करने के लिए धन्यवाद –

2

मैं [button.layer removeAllAnimations] फोन करके समस्या को हल कर दिया है।

+0

मैंने इसे थक दिया लेकिन यह मेरे लिए काम नहीं करता है। आपके कोड में आप इस विधि को कहां से कहते हैं? – Supertecnoboff

8

पुराना लेकिन दूसरा विकल्प।

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

-(void)someEventSoStop 
{ 
    button.transform = CGAffineTransformMakeScale(1.0, 1.0); 
    [UIView animateWithDuration: 0.4 
          delay: 0.0 
         options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState 
        animations: ^{ 
         button.transform = CGAffineTransformIdentity; 
        } completion: ^(BOOL finished){ 

        }]; 
} 
+0

यह अन्य समाधान की तुलना में एक अच्छा दृष्टिकोण है क्योंकि यह आसानी से एनीमेशन को पहचान में लाता है। – Nikolozi

1

देखें वर्ग संदर्भ के प्रलेखन के अनुसार: यदि आप वर्ग तरीकों animateWithDuration:delay:options:animations:completion: जैसे कि अगर अवधि नकारात्मक मूल्य या 0 पर सैट के किसी भी उपयोग किया है, परिवर्तन एनीमेशन के बिना प्रदर्शन किया जाता है।

[UIView animateWithDuration:0.0 animations:^{ 
     button.layer.affineTransform = CGAffineTransformIdentity; 
    }]; 

मुझे लगता है कि यह सुझाव दिया जवाब के रूप में परत से सभी एनिमेशन को दूर करने से बेहतर है: तो मैं अनंत एनीमेशन को रोकने के लिए कुछ इस तरह से किया था। ध्यान दें कि यह UIView क्लास में सभी अन्य क्लास एनीमेशन विधियों के लिए लागू है।

+0

यह मेरे लिए काम नहीं किया। मुझे हटाए गए सभी एनीमेशन को कॉल करना पड़ा। –