在每次迭代后显示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方法有局限性,主要的事实,你需要提前创建所有图像 - 这可能占用大量内存。

一种替代方法是使用CALayerNSTimer:每次触发时,您将layer.contents设置为下一个图像。有关此方法的更多信息,请参阅this

对于更高级的方法,你可以求助于cocos2d或openGL,但这可能是矫枉过正。

+0

这就是我试图避免的。加载应用程序时,图像的生成需要很长时间才能完成。我会研究你的第二种方法。 – Scott 2013-02-22 00:15:40

+0

是的,'animationImages'非常易于使用,但它不能提供很多控制。 'CALayer' +定时器方法肯定更灵活,而且也不复杂。 – sergio 2013-02-22 08:13:15

考虑添加块参数到您的-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永久重复