UIViewPropertyAnimator перестает работать после представления другого контроллера

Я использую UIViewPropertyAnimator для сокращения заголовка контроллера моего представления:

- (UIViewPropertyAnimator *)headerAnimator {
    if (!_headerAnimator) {
        _headerAnimator = [[UIViewPropertyAnimator alloc] initWithDuration:2.f curve:UIViewAnimationCurveLinear animations:^{
            self.profileImageBorderWidthConstraint.constant = 58.f;
            self.profileImageBorderHeightConstraint.constant = 58.f;
            self.profileImageBorder.layer.cornerRadius = 29.f;

            self.profileImageView.layer.cornerRadius = 25.f;

            self.nameLabelTopConstraint.constant = 16.f;

            [self.headerView layoutIfNeeded];
        }];
    }

    return _headerAnimator;
}

При прокрутке я установил fragment:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat fraction = (scrollView.contentOffset.y / (HeaderHeight-CollapsedHeaderHeight));
    self.headerAnimator.fractionComplete = fraction;
}

Это отлично работает. Но после того, как я представляю другой UIViewController от этого контроллера и отклонить его, аниматор переходит в неактивное состояние и перестает отвечать на настройки дроби. Как я могу перезапустить это?

Что я уже пробовал:

  • установка моего свойства аниматора в nil, чтобы восстановить его в следующий раз (вылетает)
  • приостановить его -viewWillAppear: стать активным (становится активным, но не оживляет)
  • начать его -viewWillAppear: (остается неактивным)

1 ответ

До сих пор я нашел идеальное решение для iOS 11+ и обходной путь для более ранних ОС.

iOS 11: нужно установить pausesOnCompletion в YES, Это оставляет анимацию в активном состоянии даже после закрытия контроллера.

Для более ранних версий мне пришлось оставить UIViewPropertyAnimator и создайте собственную функцию, в которой часть анимации будет изменяться, и интерполируйте значения вручную:

- (void)animateHeaderToScrollPoint {
    // Header
    CGFloat fraction = self.tableView.contentOffset.y / (HeaderHeight-CollapsedHeaderHeight);
    fraction = fminf(fraction, 1.f);
    fraction = fmaxf(fraction, 0.f);
    fraction = 1.f - fraction;

    self.profileImageBorderWidthConstraint.constant = 58.f + (86.f - 58.f) * fraction;
    self.profileImageBorderHeightConstraint.constant = 58.f + (86.f - 58.f) * fraction;
    self.profileImageBorder.layer.cornerRadius = 29.f + (43.f - 29.f) * fraction;

    self.profileImageView.layer.cornerRadius = 25.f + (39.f - 25.f) * fraction;

    self.nameLabelTopConstraint.constant = 16.f + (31.f - 16.f) * fraction;

    [self.headerView layoutIfNeeded];
}
Другие вопросы по тегам