UIView ब्लॉक-आधारित एनीमेशन को कैसे रद्द करें?


86

मैंने एसओ सामान का लोड किया है और Apple के संदर्भों में, लेकिन फिर भी अपनी समस्या को प्रबंधित करने में असमर्थ हूं।

जो मेरे पास है:

  1. 2 UIImageViewएस और 2 UIButtonएस के साथ एक स्क्रीन उनसे जुड़ी
  2. एनीमेशन के 2 प्रकार:
    1. स्केलिंग और फिर प्रत्येक छवि के नीचे, एक के बाद एक, केवल एक बार में viewDidLoad
    2. जब एक बटन दबाया जाता है (प्रत्येक के अंदर एक कस्टम बटन छिपा होता है UIImageView) तो यह उपयुक्त- UIImageViewएक के एनीमेशन को ट्रिगर करता है , न कि दोनों (साथ ही स्केल अप, फिर डाउन)।
    3. जैसा कि मैं iOS4 के लिए लिख रहा हूं + मुझे ब्लॉक आधारित एनिमेशन का उपयोग करने के लिए कहा गया है!

क्या चाहिए मुझे:

मैं एक रनिंग एनीमेशन कैसे रद्द करूं? मैं आखिरकार रद्द करने में कामयाब रहा, लेकिन पिछले एक ...: /

यहाँ मेरा कोड स्निपेट है:

[UIImageView animateWithDuration:2.0 
                               delay:0.1 
                             options:UIViewAnimationOptionAllowUserInteraction 
                          animations:^{
        isAnimating = YES;
        self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 2.0, 2.0);
    } completion:^(BOOL finished){
        if(! finished) return;
        [UIImageView animateWithDuration:2.0 
                                   delay:0.0 
                                 options:UIViewAnimationOptionAllowUserInteraction 
                              animations:^{
            self.bigLetter.transform = CGAffineTransformScale(self.bigLetter.transform, 0.5, 0.5);
        } completion:^(BOOL finished){
            if(! finished) return;
            [UIImageView animateWithDuration:2.0 
                                       delay:0.0 
                                     options:UIViewAnimationOptionAllowUserInteraction 
                                  animations:^{
                self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 2.0, 2.0);
            } completion:^(BOOL finished){
                if(! finished) return;
                [UIImageView animateWithDuration:2.0 
                                           delay:0.0 
                                         options:UIViewAnimationOptionAllowUserInteraction 
                                      animations:^{
                    self.smallLetter.transform = CGAffineTransformScale(self.smallLetter.transform, 0.5, 0.5);
                }
                                      completion:^(BOOL finished){
                                          if (!finished) return;
                                          //block letter buttons
                                          [self.bigLetterButton setUserInteractionEnabled:YES];
                                          [self.smallLetterButton setUserInteractionEnabled:YES];
                                          //NSLog(@"vieDidLoad animations finished");
                                      }];
            }];
        }];
    }];

किसी भी तरह से smallLetter UIImageViewठीक से काम नहीं कर रहा है, क्योंकि जब दबाया (बटन के माध्यम से) bigLetterएनिमेशन ठीक से रद्द कर रहा है ...

संपादित करें: मैं इस समाधान का उपयोग किया है, लेकिन अभी भी नीचे स्केलिंग के साथ समस्या है smallLetter UIImageView- बिल्कुल भी रद्द नहीं कर रहा है ... समाधान

EDIT2: मैंने इसे अगले / प्रचलित तरीकों की शुरुआत में जोड़ा है:

- (void)stopAnimation:(UIImageView*)source {
    [UIView animateWithDuration:0.01
                          delay:0.0 
                        options:(UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction)
                     animations:^ {
                         source.transform = CGAffineTransformIdentity;
                     }
                     completion:NULL
     ];
}

समस्या बनी रहती है ...: / कोई विचार नहीं है कि एनीमेशन श्रृंखला में अक्षरों के लिए अंतिम एनीमेशन को कैसे बाधित किया जाए


मुझे लगता है कि हरि कुंवर के जवाब को अब स्वीकार किया जाना चाहिए।
marczellm

इन दिनों आपको UIViewPropertyAnimator का उपयोग करना चाहिए - यह बहुत आसान है, भी।
फेटी

जवाबों:


151

आप कॉल करके किसी दृश्य पर सभी एनिमेशन रोक सकते हैं:

[view.layer removeAllAnimations];

(आपको view.layer पर कॉल करने के तरीकों के लिए क्वार्ट्जकोर फ्रेमवर्क आयात करने की आवश्यकता होगी)।

यदि आप एक विशिष्ट एनीमेशन को रोकना चाहते हैं, तो सभी एनिमेशन नहीं, तो आपका सबसे अच्छा शर्त यह है कि आप UIView एनीमेशन सहायक विधियों के बजाय स्पष्ट रूप से CAAnimations का उपयोग करें, तो आपके पास अधिक दानेदार नियंत्रण होगा और नाम से स्पष्ट रूप से एनिमेशन रोक सकते हैं।

Apple कोर एनीमेशन प्रलेखन यहाँ पाया जा सकता है:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html


10
बस जोड़ना चाहते हैं, मेरे स्वयं के अवलोकन में, बाद में चेतनअवधि हटाने को हटाने के बाद काम नहीं करता है। यह पेगनेशन करने और रिफ्रेश कंट्रोल करने के लिए खींचने के लिए है, हो सकता है कि कोई दूसरा कुछ अलग देख सकता है। मैं CabasicAnimation का उपयोग करते हुए समाप्त करता हूं और कॉल करता हूं [myView.layer removeAnimationForKey: @ "animationKey"];
जांग

टिप के लिए धन्यवाद @ निक - बस एक सिर है कि लिंक अब समर्थित नहीं लगता है, इस के बजाय एक प्रयास करें: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…
trdavidsx

52

IOS 10 के लिए UIViewPropertyAnimator का उपयोग चेतन करने के लिए करें। यह UIView एनिमेशन को शुरू करने, रोकने और रोकने के तरीके प्रदान करता है।

 let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
        self.view.alpha = 0.0
 }
 // Call this to start animation.
 animator.startAnimation()

 // Call this to stop animation.
 animator.stopAnimation(true)

3

मैं निक के जवाब में जोड़ दूंगा कि रिमूवल एलाइमेशन को सुचारू बनाने के लिए अगला विचार बहुत आसान है।

[view.layer removeAllAnimations];
[UIView transitionWithView:self.redView
                  duration:1.0f options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                      [view.layer displayIfNeeded];
                  } completion:nil];

0

आप इसे (स्विफ्ट में) आज़मा सकते हैं:

UIView.setAnimationsEnabled(false)
UIView.setAnimationsEnabled(true)

नोट: यदि आवश्यक हो, तो आप उन दो कॉल के बीच कोड डाल सकते हैं:

UIView.setAnimationsEnabled(false)
aview.layer.removeAllAnimations() // remove layer based animations e.g. aview.layer.opacity
UIView.setAnimationsEnabled(true)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.