Как убедиться, что setImage UIImageView завершено до следующего кадра - PullRequest
1 голос
/ 30 мая 2011

У меня есть код, который непрерывно генерирует фреймы UIImage для анимации. В настоящее время я использую изменяемый массив для сохранения этих объектов изображения, которые можно анимировать с помощью методов анимации UIImageView. Примерно так:

NSMutableArray *myFrames...;
while ( number of frames required ) {
    create UIImage frame_xx;
    [myFrames addObject:frame_xx];
}
myUImageView.animationImages = myFrames;
myUImageView.animationDuration = time_length_for_animation;
[myUImageView startAnimating];

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

В идеале я хотел бы немедленно отобразить каждый кадр, а не генерировать несколько кадров для анимации. Анимация может быть немного медленнее, но я не буду ограничиваться памятью. Как только отображается frame_xx, я больше не забочусь об этом кадре и хочу отобразить следующий кадр.

Я пытался использовать следующее, и они не работают:

[myUImageView setImage:frame_xx] // This only displays the last frame generated in the loop

Я также попытался создать новую тему:

        [NSThread detachNewThreadSelector: @selector(displayImage) toTarget:myUImageView withObject:frame_xx]; // again this only shows the last frame generated in the loop

Так что я ищу помощь ... как вы сразу отображаете рамку изображения в UIImageView, вроде как "сбрасывать" сразу после [myUImageView setImage: frame_xxx]

Любая помощь по этому вопросу будет принята с благодарностью ..

KAS

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Вы пробовали NSTimer? Существуют более точные способы управления временем, но это должно работать для базовых потребностей, если частота кадров достаточно низкая В этом примере я использую 10fps. (Я не скомпилировал этот код.)

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(nextFrame:) userInfo:nil repeats:YES];

...

- (void)nextFrame:(NSTimer*)timer {
    UIImage *image = ... generate image ...
    [self.imageView setImage:image];
}

Основная проблема в вашем текущем дизайне заключается в том, что вы должны позволить завершить цикл запуска, если хотите, чтобы изображение было нарисовано. Вы не можете и не должны вызывать рисование в середине цикла событий.

0 голосов
/ 30 мая 2011

Вы пытались не использовать UIImageView и рисовать ваши изображения в drawRect: метод?

Что-то вроде:

    [image drawInRect:rect]; // where 'rect' is the frame for the image

Кроме того, никогда не выполняйте рисование пользовательского интерфейса в отдельном потоке.Вы будете страдать от случайных и постоянных сбоев от этого.NSThread # detachNewThreadSelector не является предпочтительным способом выполнения многопоточных задач на iOS.Посмотрите на NSOperation и NSOperationQueue.Затем, когда вам нужно отрисовать пользователю пользовательского интерфейса метод экземпляра NSObject executeSelectorOnMainThread:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...