2011-09-18 3 views
6

के साथ फ्लिकरिंग मैं खाली फॉर्म फ़ील्ड में एक संकेतक को एनिमेट करने की कोशिश कर रहा हूं, इसलिए मैं स्थिति को एनिमेट करने, एनीमेशन को उलटाने और दोहराने के लिए नीचे दी गई विधि का उपयोग कर रहा हूं। सिम्युलेटर में यह ठीक काम करता है, मेरे 3 जीएस पर ऐसा लगता है कि समापन ब्लॉक कहलाता है जब एक झिलमिलाहट सही है। संकेतक मूल रूप से इसके मूल की तुलना में मध्य स्थिति में संक्षेप में दिखाया गया है।UIView एनीमेशन एटोरवर्स

यह क्यों हो रहा है पर कोई विचार? धन्यवाद।

- (void)bounceFormIndicator { 
    if (formIndicator.superview == nil) { 
     return; 
    } 

    int bounceDistance = 24; 

    [UIView animateWithDuration:0.6 
          delay:0 
         options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x += bounceDistance; 
         formIndicator.frame = indicatorFrame; 
        }completion:^(BOOL finished){ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x -= bounceDistance; 
         formIndicator.frame = indicatorFrame; 
         [self bounceFormIndicator]; 
        }]; 
} 
+0

अभी भी हल नहीं हुआ है, लेकिन मुझे एक काम मिल गया। मैं UIViewAnimationOptionRepeat विकल्प का उपयोग करता हूं और पूरी तरह से समापन ब्लॉक को हटा देता हूं। – brianpartridge

उत्तर

13

मुझे एक ही समस्या थी, और एक कामकाज में मदद करने के लिए ऐप्पल डीटीएस गया।

डीटीएस के अनुसार, यह 'झटकेदार' प्रभाव, या स्नैप-बैक प्रभाव अपेक्षित व्यवहार है ... मैंने सोचा कि मैं लंबे समय से अपनी परियोजना के साथ कुछ गलत कर रहा था।

विशेष रूप से यह इस तरह से है, क्योंकि प्रलेखन राज्यों,

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]; 
}