我有一些计数器,它是由包含数字图像的多个UIScrollView构建的。计数器会定期更新新旧编号和动画持续时间。更新实际上是针对循环的,总是递增+1的计数器。当我将其放入动画块时,动画的执行就像我刚刚将其更新为Value一样,就像没有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) {
}];
}
动画块中设置的属性的最终值是系统将用于动画的值。可以通过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];
}
}];
}
我认为问题在于,当您启动for循环时,动画不会启动。它穿过bolck,然后看到最后一个值并设置该值的动画。。但我不能百分之百确定这是否是个问题。也许如果你尝试这样做:
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++;
}];
或者将动画放入循环