Анимация UIView прекращается, когда вид исчезает, не возобновляется при повторном появлении
Здесь моя конфигурация:
У меня есть раскадровка с ListViewController. В ListViewController есть подзаголовок UIView, называемый EmptyListView. EmptyListView отображается только в том случае, если в UITableView нет элементов, иначе он скрыт.
У EmptyListView есть subview UIImageView с именем emptyListViewArrow, который визуально указывает на кнопку, чтобы создать новую запись в моем UITableView. Эта стрелка анимируется бесконечно вверх и вниз.
Я слушаю, как EmptyListView отправляет уведомление, когда он закончил выкладывать его в виде subviews. Я делаю это, потому что если нет, анимации, которые мутируют ограничения, ведут себя некорректно.
- (void) layoutSubviews {
[super layoutSubviews];
[[NSNotificationCenter defaultCenter] postNotificationName:@"EmptyViewDidLayoutSubviews" object:nil];
}
Когда ListViewController наблюдает это уведомление, он начинает анимацию:
[UIView animateWithDuration:0.8f delay:0.0f options:(UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse) animations:^{
self.emptyListViewArrowVerticalSpace.constant = 15.0f;
[emptyListView layoutIfNeeded];
} completion:nil];
Если я положил приложение в фоновом режиме или нажал другой ViewController в стеке, как только я вернусь в приложение или ListViewController, анимация остановится/приостановлена. Я не могу заставить его начать снова.
Я пробовал:
- Прослушивание приложения будет отменено/станет активным. Когда я ушел в отставку, я сделал [self.view.layer removeAllAnimations], а затем попытался снова запустить анимацию, используя вышеприведенный код.
- Удаление анимации UIImageView и добавление ее обратно в родительское представление, а затем попытка запустить анимацию.
Я сожалею об использовании ограничений здесь, но хотел бы получить представление о том, что может быть проблемой.
Спасибо!
Ответы
Ответ 1
Я не уверен, что вы делаете с этим уведомлением. Я сделал много анимаций с ограничениями и никогда не делал этого. Я думаю, проблема заключается в том, что когда вы покидаете представление, значение константы ограничения будет равно 15 (я проверял, что с журналами в viewWillDisappear), поэтому анимация, чтобы установить ее на 15, ничего не сделает. В тестовом приложении я установил константу в исходное значение (0) в viewWillAppear и работал нормально:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.bottomCon.constant = 0;
[self.view layoutIfNeeded];
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[UIView animateWithDuration:1 delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
self.bottomCon.constant = -40.0f;
[self.view layoutIfNeeded];
} completion:nil];
}
Ответ 2
Это недостаток.
Чтобы преодолеть это, вам нужно снова вызвать метод анимации.
Вы можете сделать это следующим образом:
Добавить наблюдателя в контроллер
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeAnimation:) name:UIApplicationDidBecomeActiveNotification object:nil];
Это будет вызвано после возобновления приложения.
Добавьте этот метод:
- (void)resumeAnimation:(NSNotification *)iRecognizer {
// Restart Animation
}
Надеюсь, это поможет вам.