动画多个uiscrollviews反制样式

时间:2012-01-23 00:27:40

标签: ios animation uiscrollview

我有一些由多个UIScrollView构建的计数器,其中包含数字图像。 计数器定期更新旧的和新的数字和动画持续时间。 更新实际上是循环总是递增+1的计数器。 当我把它放到动画块中时,就像我刚刚将它更新为toValue一样执行动画,就像没有for循环一样。

我想要的是以线性方式执行动画,我想看到每个数字(如果动画不是太快而不是)。在一些奇怪的场景中,计数器只是跳转到[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) {
                 }];

}

2 个答案:

答案 0 :(得分: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 :(得分: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循环