UIImageView animationRepeatCount 奇怪的行为

UIImageView animationRepeatCount strange behaviour

所以我有这段代码可以无限次地为一组图像设置动画效果,但是一旦我尝试限制它设置动画效果的次数,它就无法正常工作。甚至没有显示图像。

有效代码:

animatedMap.animationImages = [NSArray arrayWithObjects:
                               [UIImage imageNamed:@"0.gif"],
                               [UIImage imageNamed:@"1.gif"],
                               [UIImage imageNamed:@"2.gif"],
                               [UIImage imageNamed:@"3.gif"],
                               //etc...];
animatedMap.animationDuration = 20.0f;
animatedMap.animationRepeatCount = 0;
[animatedMap startAnimating];

无效代码:

animatedMap.animationImages = [NSArray arrayWithObjects:
                               [UIImage imageNamed:@"0.gif"],
                               [UIImage imageNamed:@"1.gif"],
                               [UIImage imageNamed:@"2.gif"],
                               [UIImage imageNamed:@"3.gif"],
                               //etc...];
animatedMap.animationDuration = 20.0f;
animatedMap.animationRepeatCount = 1;
[animatedMap startAnimating];

这看起来真的很奇怪?

animationRepeatCount 用于在给定的 animationDuration 持续时间内循环所有图像。

因此,如果您提供 animatedMap.animationRepeatCount = 1;,这意味着只有 1 个循环将 运行,然后将显示默认设置的图像。如果您没有将默认图像定义为 UIImageView 那么它将是空白的(即 UIImageView 的背景颜色)

有可能比给定的动画持续时间有更多的图像,这会导致超快的动画。

更新 1

您可以在开始动画之前设置最后一张图片。

NSArray *imgArray = [NSArray arrayWithObjects:
                           [UIImage imageNamed:@"0.gif"],
                           [UIImage imageNamed:@"1.gif"],
                           [UIImage imageNamed:@"2.gif"],
                           [UIImage imageNamed:@"3.gif"],
                           //etc...];
[animatedMap setImage:[UIImage imageNamed:[imgArray lastObject]]];
animatedMap.animationImages = imgArray
animatedMap.animationDuration = 20.0f;
animatedMap.animationRepeatCount = 0;
[animatedMap startAnimating];

我注意到了相同的行为,我的解决方案是将动画代码的开头放在不同的位置。

对我来说,它是一个视图控制器,所以我把 imageView.startAnimating() 放在 viewWillAppear: 而不是 viewDidLoad:

我不是 100% 明白问题出在哪里,但可以假设动画不会触发,因为通过将 animationRepeatCount 设置为 1,您的 "one animation" 发生在视图之前被展示。更具技术性的是,CATransaction::Commit 和一个动画在显示视图 之前 执行,而不是在显示视图 时执行.