我遇到了这个棘手的问题,我甚至不确定如何解释它(因为NDA无法显示太多代码)
我的视图有一个自定义元素,一个彩色条,它根据用户滚动表格动画曲线。这很好用,当用户滚动,委托被调用并且更新彩色条曲线的方法也被调用。因此,曲线会在循环中更新"。
现在我必须以编程方式移动它。 动画发生时,彩色条不会动画,而是突然变为最终状态。
我知道为什么会这样。
view.layoutIfNeeded()
UIView.animate(withDuration: 0.2, animations: {
self.headerHeightConstraint.constant = self.maxHeaderHeight
self.updateHeaderAlpha()
self.view.layoutIfNeeded()
}, completion: { _ in
onComplete()
})
将约束值设置为最终值,并且updateHeaderAlpha(此设置曲线值)仅调用一次。因此,动画确实发生了,但是条形图从开始变为最终状态。
"解决方案"应该在"每个周期"中调用updateHeader方法。动画,但我不能这样做。我已经尝试过了:
动画中的用户重复和beginFromCurrentState并更改:
self.headerHeightConstraint.constant = self.maxHeaderHeight
的
self.headerHeightConstraint.constant -= 1
这会产生一个奇怪的动画,而不是解决问题并创建一个新的动画 - 递归调用动画,直到约束的值是所需的值。 听起来很糟糕,这种方法比我想要的更接近,除了动画完全忽略动画持续时间并花费很长时间。即:
func collapseHeader(_ onComplete: @escaping (()->Void) = {}) {
view.layoutIfNeeded()
UIView.animate(withDuration: 0, animations: {
self.headerHeightConstraint.constant -= 1
self.updateHeaderAlpha()
self.view.layoutIfNeeded()
}, completion: { _ in
if self.headerHeightConstraint.constant <= self.minHeaderHeight + 1 {
onComplete()
} else {
self.collapseHeader() {
onComplete()
}
}
})
}
(我知道这不应该这样做)
请注意,动画持续时间为0(我已尝试过,0.2,0.02,10,5等等),但动画需要25-30秒才能完成。
我尝试过的另一种方法是将表的de offset更改为&#34;模拟&#34;用户交互,但这通常会对动画和视图产生非常奇怪的副作用。
考虑到修改彩色条不是一个选项。
任何人都知道为什么递归调用的动画花了太长时间?
甚至更好,任何人都可以考虑更好的解决方案吗?
谢谢!