在每次迭代后显示UIImage
问题描述:
我有一个函数可以改变需要很长时间才能完成的图像(大约10s)。这个图像改变了每次迭代,我想每次都显示它。在每次迭代后显示UIImage
我想
self.imageView.image = [ /* function that changes image */ ];
,但我接受,为什么这是行不通的。
我也试过如下:
self.imageView.animationImages = [NSArray arrayWithObjects:[self.brain newImage],
[self.brain newImage],
nil];
,但它需要很长的时间,动画开始之前。
如何在每次调用函数时更新动画?
注意:[self.brain newImage]
是一个有效的函数,它返回一个UIImage,并且每次都会更改。我没有包含实际的代码,因为它很复杂而不是问题。
答
如果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,但这可能是矫枉过正。
答
考虑添加块参数到您的-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];
}];
答
你可以试试这个代码设置您的图像阵列上的动画
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];
}
我已经设置了th e动画时间1/20根据FPS你可以设置你的动画重复次数为0永久重复
这就是我试图避免的。加载应用程序时,图像的生成需要很长时间才能完成。我会研究你的第二种方法。 – Scott 2013-02-22 00:15:40
是的,'animationImages'非常易于使用,但它不能提供很多控制。 'CALayer' +定时器方法肯定更灵活,而且也不复杂。 – sergio 2013-02-22 08:13:15