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];
}