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
和一个动画在显示视图 之前 执行,而不是在显示视图 时执行.
所以我有这段代码可以无限次地为一组图像设置动画效果,但是一旦我尝试限制它设置动画效果的次数,它就无法正常工作。甚至没有显示图像。
有效代码:
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
和一个动画在显示视图 之前 执行,而不是在显示视图 时执行.