[Ios] UIView एनीमेशन रद्द करें?


Answers

उपयोग:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];
Question

प्रगति पर होने पर UIView एनीमेशन को रद्द करना संभव है? या मुझे सीए स्तर पर जाना होगा?

यानी मैंने ऐसा कुछ किया है (शायद अंत एनीमेशन एक्शन भी सेट कर रहा है):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

लेकिन एनीमेशन पूर्ण होने से पहले और मुझे एनीमेशन समाप्त हो गया, मैं इसे रद्द करना चाहता हूं (इसे छोटा करें)। क्या यह संभव है? चारों ओर गुगल करने से कुछ लोग बिना किसी जवाब के एक ही प्रश्न पूछते हैं - और एक या दो लोग अनुमान लगाते हैं कि यह नहीं किया जा सकता है।




आईओएस 4 और इससे अधिक पर, पहले एनीमेशन को कम करने के लिए दूसरी एनीमेशन पर UIViewAnimationOptionBeginFromCurrentState विकल्प का उपयोग करें

उदाहरण के तौर पर, मान लें कि आपके पास एक गतिविधि संकेतक के साथ एक दृश्य है। आप गतिविधि संकेतक में फीका करना चाहते हैं, जबकि कुछ संभावित समय लेने वाली गतिविधि शुरू होती है, और गतिविधि खत्म होने पर इसे खत्म कर देती है। नीचे दिए गए कोड में, गतिविधि संकेतक के साथ दृश्य को गतिविधि दृश्य कहा जाता activityView

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}



यदि आप दृश्य संपत्ति के बजाय निरंतर बदलकर बाधा को एनिमेट कर रहे हैं तो अन्य विधियों में से कोई भी आईओएस 8 पर काम नहीं करता है।

उदाहरण एनीमेशन:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

उपाय:

आपको बाधा परिवर्तन और उनके उत्थानकों से प्रभावित किसी भी विचार की परतों से एनिमेशन को हटाने की आवश्यकता है।

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}






यहां तक ​​कि अगर आप एनीमेशन के उपरोक्त तरीकों से एनीमेशन रद्द करते हैं तो didStopSelector अभी भी चलता है। इसलिए यदि आपके पास एनिमेशन द्वारा संचालित आपके एप्लिकेशन में तर्क राज्य हैं तो आपको समस्याएं होंगी। इस कारण से ऊपर वर्णित तरीकों के साथ मैं UIView एनिमेशन के संदर्भ चर का उपयोग करता हूं। यदि आप एनीमेशन के संदर्भ पैरामीटर द्वारा अपने प्रोग्राम की वर्तमान स्थिति को पास करते हैं, तो जब एनीमेशन आपके didStopSelector फ़ंक्शन को रोकता है तो यह तय कर सकता है कि इसे कुछ करना चाहिए या वर्तमान स्थिति के आधार पर वापस लौटना चाहिए और राज्य मूल्य संदर्भ के रूप में पारित किया गया है।




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

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;



[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];