UIImage的重复更新未显示在屏幕上

时间:2011-08-18 08:19:06

标签: objective-c ios multithreading uiimage sleep

我正在使用一款具有旋转体动画效果的iOS应用。一系列UIImages存储在NSArray中,变量跟踪当前图像的索引。

以下方法更新UIImageView

- (void)renewImage{
    [rotatingBody.image release];
    rotatingBody.image = [[UIImage alloc] initWithContentsOfFile:[currentPerson.imageArray objectAtIndex:pictureIndex]];
}

到目前为止,我已将该方法称为对触摸事件的响应。从触摸事件我计算一个新的pictureIndex然后调用[self renewImage]。它运作得很好。

然而,现在我想为动画添加动力。我没有立即计算下一张图像,而是计算速度。我打算在一个单独的线程中有一个循环来通过使用速度变量来更新pictureIndex,降低速度并最终调用[self renewImage]。

输入问题

每当我在同一个函数中连续多次调用[self renewImage]时(例如在一个循环中或者只是两次被某种睡眠分开),屏幕将不会更新,直到最后一次调用之后。就好像设备(或编译器)合理化了第一次更新,即使我确定已经访问了renewImage方法(感谢跟踪)。

以下是一些不起作用的测试代码:

while (velocity > 0) {
        pictureIndex++;
        pictureIndex = pictureIndex % [self getNumberOfImages];
        if (pictureIndex < 0)
        {
            pictureIndex += [self getNumberOfImages];
        }
        velocity -= 20;
        NSLog(@"velocity: %f", velocity);
        [self renewImage];
        [NSThread sleepForTimeInterval:0.5];
    }

这两个都没有:

pictureIndex += 20;
[self renewImage];
sleep(1);
pictureIndex += 20;
[self renewImage];

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用NSTimer回调来更改图像,这样一切都在运行循环中发生,而不是在单独的线程上发生。

如果NSTimer不能满足您的需求,您需要在主线程上调用一个方法来更改图像,因为其他线程上的UI更改不会立即更新。