मुझे एक ही समस्या थी, और एक कामकाज में मदद करने के लिए ऐप्पल डीटीएस गया।
डीटीएस के अनुसार, यह 'झटकेदार' प्रभाव, या स्नैप-बैक प्रभाव अपेक्षित व्यवहार है ... मैंने सोचा कि मैं लंबे समय से अपनी परियोजना के साथ कुछ गलत कर रहा था।
विशेष रूप से यह इस तरह से है, क्योंकि प्रलेखन राज्यों,
UIViewAnimationOptionAutoreverse रन के लिए एनीमेशन पीछे और आगे।
UIViewAnimationOptionRepeat विकल्प के साथ जोड़ा जाना चाहिए।
फ्लिकर जाने के लिए, मुझे 2 चीजें करना पड़ा।
मेरा कार्यान्वयन गतिशील था, इसलिए आपको पहले चरण को लागू करने की आवश्यकता नहीं हो सकती है, लेकिन मैं इसे संदर्भ के लिए यहां रखूंगा।
पहले, मैं देखने के लिए अगर UIViewAnimationOptionAutoreverse
विकल्प मैं अपने एनीमेशन में पारित करने के लिए जा रहा था का हिस्सा था जाँच की, और UIViewAnimationOptionRepeat
नहीं था ... यदि हां, तो मैं इसे की तरह एक पंक्ति जोड़कर विकल्पों से छीन लिया:
animationOptions &= ~UIViewAnimationOptionAutoreverse;
दोहराने के बिना रिवर्सिंग एनीमेशन बनाने के लिए, मैंने अपने समापन ब्लॉक के रूप में एक विपरीत UIView एनीमेशन जोड़ा। मैं भी सहजता उल्टे अगर यह या तो UIViewAnimationOptionCurveEaseIn
या UIViewAnimationOptionCurveEaseOut
...
था अपने प्रोजेक्ट से कोड इस प्रकार है:
बयान है कि एक वस्तु के animationOptions से autoreverse विकल्प स्ट्रिप्स:
if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) {
self.shouldAutoreverse = YES;
animationOptions &= ~AUTOREVERSE;
}
एक एक ओवरराइड संपत्ति सेटर कि एक एनीमेशन संभालती का उदाहरण:
-(void)setCenter:(CGPoint)center {
CGPoint oldCenter = CGPointMake(self.center.x, self.center.y);
void (^animationBlock) (void) =^{ super.center = center; };
void (^completionBlock) (BOOL) = nil;
BOOL animationShouldNotRepeat = (self.animationOptions & REPEAT) != REPEAT;
if(self.shouldAutoreverse && animationShouldNotRepeat) {
completionBlock =^(BOOL animationIsComplete) {
[self autoreverseAnimation:^ { super.center = oldCenter;}];
};
}
[self animateWithBlock:animationBlock completion:completionBlock];
}
पूरा होने विधि टी में के लिए बुलाया वह दोहराने के बिना उलटने का मामला:
-(void)autoreverseAnimation:(void (^)(void))animationBlock {
C4AnimationOptions autoreverseOptions = BEGINCURRENT;
if((self.animationOptions & LINEAR) == LINEAR) autoreverseOptions |= LINEAR;
else if((self.animationOptions & EASEIN) == EASEIN) autoreverseOptions |= EASEOUT;
else if((self.animationOptions & EASEOUT) == EASEOUT) autoreverseOptions |= EASEIN;
[UIView animateWithDuration:self.animationDuration
delay:0
options:autoreverseOptions
animations:animationBlock
completion:nil];
}
अभी भी हल नहीं हुआ है, लेकिन मुझे एक काम मिल गया। मैं UIViewAnimationOptionRepeat विकल्प का उपयोग करता हूं और पूरी तरह से समापन ब्लॉक को हटा देता हूं। – brianpartridge