如何控制 UIView 动画的速度?

Neo*_*ang 1 animation uiview ios swift

我正在实现这样的旋转数字视图:https : //github.com/jonathantribouharet/JTNumberScrollAnimatedView

但是,不是从 1 滚动到 9,我希望动画继续滚动(1 到 9,然后回到 1 到 9),直到我手动停止它。

我通过添加 UILabel 子视图 1-9、垂直堆叠并在底部为数字 1 添加一个额外的标签来实现这一点。旋转到底部时(显示底部标签1),在动画完成闭包中,我将变换设置回原点,显示顶部标签1,并重新启动旋转动画。

这工作正常,但由于每个旋转 (1-9-1) 是独立的,因此 1-9 的动画会加速,然后在 1 处停止,并在下一次迭代中加快速度。这不是我想要的,我希望旋转在迭代之间保持恒定速度。

我怎样才能用 UIView 动画做到这一点?

这是代码:

 public func startAnimation(){
    UIView.setAnimationCurve(UIViewAnimationCurve.easeIn)
    UIView.animate(withDuration: TimeInterval(self.loopDuration), animations: { [unowned self] in
        self.container!.transform = CGAffineTransform(translationX: 0, y: CGFloat(-(self.endNumber-self.startNumber+1)*(self.size)))
    }) { [unowned self] (completed) in
        if self.isAnimationStopped {
            self.container!.transform = CGAffineTransform(translationX: 0, y: 0)
            UIView.setAnimationCurve(UIViewAnimationCurve.easeOut)
            UIView.animate(withDuration: TimeInterval(self.loopDuration), animations: {
                self.container!.transform = CGAffineTransform(translationX: 0, y: CGFloat(-self.targetY))
            })
        } else {
            self.container!.transform = CGAffineTransform(translationX: 0, y: 0)
            self.startAnimation()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Dun*_*n C 6

默认情况下,UIView 动画使用ease-in, ease-out动画计时,动画平滑加速,运行,然后减速停止。

您需要使用更长的 UIView.animate 形式animate(withDuration:delay:options:animations:completion:) ,它带有一个 options 参数,并指定.curveLinear.

只需为延迟指定 0.0 和 options: .curveLinear

编辑:

请注意,如果您需要指定多个选项,例如.curveLinear并且.allowUserInteraction您将使用OptionSet语法,例如options: [.curveLinear, .allowUserInteraction]