Почему объекты сбрасываются после аннулирования NSTimer?

У меня есть NSTimer который вызывает функцию, которая перемещает некоторые UIImageViewх, когда я признаю недействительным NSTimer Я думал UIImageViewбудет останавливаться на их местах, но они сбрасываются на место, установленное StoryBoard,

Есть ли что-то, что я делаю неправильно или нет, или это загадка?

РЕДАКТИРОВАТЬ - добавил код

.час

NSTimer *updater;

.m

updater = [NSTimer scheduledTimerWithTimeInterval:1.0f/32.0f target:self selector:@selector(gameEngine) userInfo:nil repeats:YES];


-(void)gameEngine {
    //move some images around
}

-(IBAction)action {
    [updater invalidate];
}

1 ответ

Решение

Если вы используете автоматический макет, когда ограничения повторно применяются (что может быть вызвано безобидными событиями, такими как установка text свойства метки), все будет возвращено туда, где они были определены ограничениями, встроенными в раскадровку (при условии, что вы пытались переместить UIImageView объекты программно, просто изменив их frame или же center свойства, а не путем изменения ограничений).

Вы можете решить это одним из двух способов.

  1. Переместить ваш UIImageView объекты путем изменения constant свойство для ограничения, а затем вызов layoutIfNeeded метод родительского представления, а не изменение frame или же center свойства UIImageView сам. Это можно упростить, если в Интерфейсном Разработчике вы создадите IBOutlet ссылки на сами ограничения.

  2. Выключите авто-макет, а затем вы можете использовать frame или же center свойства, как я подозреваю, вы в настоящее время. Вы можете отключить автоматическое расположение, открыв раскадровку, щелкнув первую вкладку в самой правой панели и сняв флажок "Использовать автоматическое расположение":

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

Другие вопросы по тегам