每次迭代后显示UIImage

时间:2013-02-21 22:24:32

标签: iphone animation uiimageview uiimage jquery-animate

我有一个功能可以更改需要很长时间才能完成的图像(大约10秒)。此图像会更改每次迭代,我希望每次都显示它。

我想

self.imageView.image = [ /* function that changes image */ ];

但我接受为什么这样做不起作用。

我也尝试了以下内容:

 self.imageView.animationImages = [NSArray arrayWithObjects:[self.brain newImage],
                                                            [self.brain newImage],
                                                             nil];

但动画开始前需要很长时间。

如何制作每次调用函数时更新的动画?

注意:[self.brain newImage]是一个返回UIImage的有效函数,每次都会更改。我没有包含实际代码,因为它很复杂而不是问题。

3 个答案:

答案 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方法有局限性,主要是因为您需要提前创建所有图像 - 这可能占用大量内存。

另一种方法是使用CALayerNSTimer:每次触发时,都会将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];

}];