完美的Swift3 Boing

4

要制作一个打开的条形动画...

@IBOutlet var barHeight: NSLayoutConstraint!


    barHeight.constant = barShut?30:100
    self.view.layoutIfNeeded()
    t = !barShut?30:100

    UIView.animate(withDuration: 0.15,
        delay: 0,
        options: UIViewAnimationOptions.curveEaseOut,

        animations: { () -> Void in
            self.barHeight.constant = t
            self.view.layoutIfNeeded()
        },

        completion: {_ in
            Screen.barShut = !Screen.barShut
        }
    ) 

太棒了...

enter image description here

但是你该如何让它像这样弹跳?

enter image description here

我唯一知道的方法是使用CADisplayLink和几行代码来实现弹簧衰减效果。这个方法在UIKit中可用吗?

你可以像动画其他约束属性一样来动画constant属性,具体请参考我的回答。 - Paulw11
1个回答

1
你可以使用UIView内置的弹簧动画方法
func toggleBar() -> Void {
    self.view.layoutIfNeeded()
    let newHeight:CGFloat = !barShut ? 30:100
    barShut = !barShut

    barHeightConstraint.constant = newHeight

    UIView.animate(withDuration: 1.5, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 3, options: [], animations: {
        self.view.layoutIfNeeded()
    }, completion: nil)

}

你需要动画持续时间比0.15秒更长,这样弹跳看起来才更真实;我认为我设置的值很好,但你可以尝试调整它们以获得你想要的确切效果。
由于动画持续时间更长,我发现在先前的动画仍在运行时,我可以点击触发打开/关闭的按钮。将barShut设置在完成块中意味着栏不会对所有点击做出反应。我将开关移出动画以解决这个问题。

哦,太棒了,Spring动画已经内置了! - Fattie
顺便说一句,对于任何阅读此内容的人来说,方便的.beginFromCurrentState有时可以帮助解决Paul在最后一段提到的问题。 - Fattie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接