忽略UIView动画的持续时间

时间:2017-03-22 22:25:10

标签: swift3 uiviewanimation

我遇到了这个棘手的问题,我甚至不确定如何解释它(因为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;用户交互,但这通常会对动画和视图产生非常奇怪的副作用。

考虑到修改彩色条不是一个选项。

任何人都知道为什么递归调用的动画花了太长时间?

甚至更好,任何人都可以考虑更好的解决方案吗?

谢谢!

0 个答案:

没有答案