我有一个功能可以更改需要很长时间才能完成的图像(大约10秒)。此图像会更改每次迭代,我希望每次都显示它。
我想
self.imageView.image = [ /* function that changes image */ ];
但我接受为什么这样做不起作用。
我也尝试了以下内容:
self.imageView.animationImages = [NSArray arrayWithObjects:[self.brain newImage],
[self.brain newImage],
nil];
但动画开始前需要很长时间。
如何制作每次调用函数时更新的动画?
注意:[self.brain newImage]
是一个返回UIImage的有效函数,每次都会更改。我没有包含实际代码,因为它很复杂而不是问题。
答案 0 :(得分:1)
您可以尝试使用此代码在图像数组上设置动画
if(imageArray.count>0)
{
self.imageView.animationImages= imageArray;
self.imageView.animationDuration = 1/20;
self.imageView.animationRepeatCount =1;
[self.imageView startAnimating];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView commitAnimations];
}
我根据FPS将动画时间设置为1/20,您可以设置自己的动画时间,并将动画重复次数设置为0,以便永远重复
答案 1 :(得分:0)
如果animationImages
方法适合您,您可以通过提前创建图像来加快启动速度:
//-- preload images (e.g., while the app is loading)
NSArray* images = [NSArray arrayWithObjects:[self.brain newImage],
[self.brain newImage],
nil];
//-- display animation
self.imageView.animationImages = images;
请记住,animationImages
方法有局限性,主要是因为您需要提前创建所有图像 - 这可能占用大量内存。
另一种方法是使用CALayer
和NSTimer
:每次触发时,都会将layer.contents
设置为下一张图像。有关此方法的详细信息,请参阅this。
对于更高级的方法,您可以使用cocos2d或openGL,但这可能有点过分。
答案 2 :(得分:0)
考虑在您的-newImage
方法中添加一个块参数:
- (void)newImageWithSuccessBlock:(void (^)(UIImage *newImage))successBlock
{
// generate the image on a background thread
UIImage *brainImage = ...
// if successful and the completion block isn't nil, run it
if (successBlock) {
// NB: if you do use a background queue,
// remember to dispatch the completion block to the main queue (not shown)
successBlock(brainImage)
}
}
然后,在从视图控制器生成新图像时,您可以更新图像视图:
[self.brain newImageWithSuccessBlock:^(UIImage *newImage) {
NSMutableArray *mutableImageArray;
if (self.imageView.animationImages) {
mutableImageArray = [self.imageView.animationImages mutableCopy];
} else {
mutableImageArray = [NSMutableArray array];
}
[mutableImageArray addObject:newImage];
self.imageView.animationImages = [NSArray arrayWithArray:mutableImageArray];
}];