2012-01-23 75 views
1

我有一些計數器從多個UIScrollViews包含圖像的數字構建。 計數器定期更新爲新舊號碼和動畫持續時間。 更新實際上是循環始終遞增+1的計數器。 當我把它放到動畫塊中時,動畫就像我剛剛更新爲toValue一樣執行,就像沒有for循環一樣。動畫多個uiscrollviews計數器像

我想要的是以線性方式執行的動畫,我想看看每個數字(如果動畫不是太快,那不是)。在一些奇怪的場景中,計數器只跳轉到[fromValue,toValue]間隔中的一些隨機數字而沒有動畫,然後動畫跳轉到toValue。

有什麼建議嗎?這裏是一些代碼

- (void) setDigit:(UIScrollView*)digit withValue:(int)value 
{ 
    CGFloat height = digit.frame.size.height; 
    [digit setContentOffset:CGPointMake(0, height * value) animated:NO]; 
} 

- (void) updateValue:(int) value 
{ 
    for (int i = 5; i >= 0; i--) 
    { 
     int a = value % 10; 
     value = value/10; 

     [self setDigit:[digits objectAtIndex:i] withValue:a]; 
    } 
} 

- (void) transitFromValue:(int)fromValue toValue:(int)toValue withDuration:(float)duration 
{ 
    [UIView animateWithDuration:duration 
         delay:0.0 
        options:UIViewAnimationCurveLinear 
       animations:^ { 
        for (int tValue = fromValue; tValue <= toValue; tValue++) 
        { 
         [self updateValue:tValue]; 
        } 

       } 
       completion:^(BOOL finished) { 
       }]; 

} 

回答

3

在動畫塊設置屬性的最終值動畫是什麼系統,是動畫要去使用。您可以通過for循環設置數千個不同的值,但只有最後一個將用於動畫。

您的最佳解決方案是一種遞歸方法,它可以動畫一個步驟,並在完成後再次調用。

- (void) transitFromValue:(int)fromValue toValue:(int)toValue withDuration:(float)duration 
{ 
    [UIView animateWithDuration:duration 
         delay:0.0 
        options:UIViewAnimationCurveLinear 
       animations:^ { 
        [self updateValue:fromValue + 1]; 
       } 
       completion:^(BOOL finished) { 
        if (finished && fromValue + 1 < toValue) { 
         [self transitFromValue:fromValue + 1 toValue:toValue withDuration:duration]; 
        } 
       }]; 

} 
1

我認爲問題在於,當您啓動for循環時,動畫無法啓動。它通過bolck,然後看到最後的價值和動畫的價值..但我不是100%肯定,如果這是一個問題。 也許你試着這樣做:

int tValue=fromValue; 
[UIView animateWithDuration:duration 
         delay:0.0 
        options:UIViewAnimationCurveLinear 
       animations:^ { 
        [self updateValue:tValue]; 
       } 
       completion:^(BOOL finished) { 
       tValue++; 
       }]; 
[UIView animateWithDuration:duration 
         delay:0.0 
        options:UIViewAnimationCurveLinear 
       animations:^ { 
        [self updateValue:tValue]; 
       } 
       completion:^(BOOL finished) { 
       tValue++; 
       }]; 

或將在for循環