2011-09-18 83 views
6

我試圖動畫指示器到一個空的表單字段,所以我使用下面的方法動畫到一個位置,扭轉動畫,並重復。在模擬器中,這可以正常工作,在我的3GS上,當完成塊被調用時,它看起來好像閃爍了。指標簡要顯示在中間位置,而不是回到原點。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

我有同樣的問題,並去蘋果DTS幫助解決方法。

根據DTS,這種「閃爍」效果或反彈效果是預期的行爲......我認爲我在很長時間內對我的項目做了錯誤的事情。

尤其是這樣,因爲文檔狀態,爲

UIViewAnimationOptionAutoreverse運行動畫向後和向前 。

必須與UIViewAnimationOptionRepeat選項結合使用。

爲了讓閃爍消失,我必須做2件事。

我的實現是動態的,所以你可能不需要實現第一步,但我會保留在這裏僅供參考。

首先,我檢查,看看是否UIViewAnimationOptionAutoreverse是的,我要通過進入我的動畫選項的一部分,並UIViewAnimationOptionRepeat不是 ......如果是這樣,我剝奪它通過增加線路,如選擇:

animationOptions &= ~UIViewAnimationOptionAutoreverse; 

要創建反轉動畫而不重複,我添加了一個相反的UIView動畫作爲我的完成塊。我倒也放鬆,如果這是不是UIViewAnimationOptionCurveEaseInUIViewAnimationOptionCurveEaseOut ...

從我的項目中的代碼如下:

這條從對象的animationOptions的自動翻轉選項聲明:

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

在t中調用的完成方法他倒車的情況下無需重複:

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