UIImageView animationRepeatCount奇怪的行为

时间:2015-04-14 07:21:56

标签: ios objective-c uiimageview

所以我有这个代码可以无限次地动画一组图像,但是只要我试图限制它动画的次数就行不通。甚至没有显示图像。

有效的代码:

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

这看起来真的很奇怪吗?

2 个答案:

答案 0 :(得分:3)

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

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

我不是100%了解问题是什么,但可以假设动画没有触发,因为将animationRepeatCount设置为1,你的"一个动画&# 34;在显示视图之前发生。为了更具技术性,带有一个动画的CATransaction::Commit在显示视图之前执行,而不是在显示 视图时执行。

答案 1 :(得分:2)

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

因此,如果您提供animatedMap.animationRepeatCount = 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];