我使用 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:
启动它(保持非活动状态(
到目前为止,
我为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];
}