0

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

我想

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

但我接受为什么那行不通。

我还尝试了以下方法:

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

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

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

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

4

3 回答 3

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 以永久重复

于 2013-02-22T04:24:13.273 回答
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];

}];
于 2013-02-22T00:58:38.867 回答
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方法有局限性,主要是您需要提前创建所有图像 - 这可能会占用大量内存。

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

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

于 2013-02-21T22:39:33.520 回答