Повторное обновление UIImage не отображается на экране - PullRequest
0 голосов
/ 18 августа 2011

Я работаю с приложением для 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 Ответ

1 голос
/ 18 августа 2011

Используйте обратный вызов NSTimer для изменения изображения, таким образом, все происходит в цикле выполнения, а не в отдельном потоке.

Если NSTimer недостаточно для ваших нужд, вам нужно вызватьметод в вашем основном потоке для изменения изображения при изменении пользовательского интерфейса в других потоках не обновляется немедленно.

...