У меня есть NSArray UIImageViews, который я хочу зациклить и быстро поменять состояние «включено» и «выключено». Я написал код для этого в цикле for вместо метода, который вызывался, когда пользователь нажимал UIButton (действие кнопки).
Вот этот цикл:
for(int i = 0; i < [Images count]; i++) {
if( i > 0 ){
[self toggleImageViewOff:[Images objectAtIndex:i - 1]];
}
[self toggleImageViewOn:[Images objectAtIndex:i]];
[NSThread sleepForTimeInterval:0.5f];
}
Пользовательский интерфейс не обновился, как я ожидал, поскольку я только когда-либо видел последний UIImageView во включенном состоянии. Я подумал, что обновление рисунка представлений должно происходить в основном потоке, в котором этот код также выполняется. Поэтому я узнал о executeSelectorInBackground: withObject:. Выполнение методов toggleImageViewOn / Off с использованием этого заставило цикл работать. Проблема в том, что если я сделаю интервал сна слишком коротким, я смогу получить обновление «включено» после «выключено» с потоками, работающими не по порядку.
Итак, у меня появилась блестящая идея переместить весь цикл со сном в его собственный метод и вызвать его из метода действия с помощью executeSelectorInBackground: withObject:. Я попробовал это, и я вернулся к тому, чтобы не получать обновленное представление, пока цикл не закончится.
Это долгий путь к моему вопросу:
Каков лучший способ анимировать это, чтобы гарантировать, что код включения / выключения срабатывает в правильном порядке и все еще получать обновления просмотра, даже на высоких скоростях? (то есть зацикливание очень быстро)
Я пытался подумать о том, как мне это сделать с CoreAnimation, но я не могу понять, как это сделать там.
Для получения бонуса используйте следующие методы переключения:
- (void)toggleImageViewOn:(UIImageView *)theImageView {
[theImageView setImage:[UIImage imageNamed:@"on.png"]];
}
- (void)toggleImageViewOff:(UIImageView *)theImageView {
[theImageView setImage:[UIImage imageNamed:@"off.png"]];
}