我正在使用一款具有旋转体动画效果的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];
有什么想法吗?
答案 0 :(得分:1)
使用NSTimer回调来更改图像,这样一切都在运行循环中发生,而不是在单独的线程上发生。
如果NSTimer不能满足您的需求,您需要在主线程上调用一个方法来更改图像,因为其他线程上的UI更改不会立即更新。