Анимация 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
}

Надеюсь, это поможет вам.