有一种更简单的方法可以直接使用摩擦和张力来实现这种动画,无需任何计算。
我们UISpringTimingParameters
使用 with UIViewPropertyAnimator
。
- 创建 UISpringTimingParameters
let springParameters = UISpringTimingParameters(
mass: 1.0,
stiffness: 260, // tension
damping: 20, // friction
initialVelocity: .init(dx: 0, dy: 1.0)
)
请注意,刚度是张力,阻尼是摩擦。
- 创建动画师并添加动画
let animator = UIViewPropertyAnimator(duration: duration, timingParameters: springParameters)
animator.addAnimations {
animations()
}
animator.startAnimation(afterDelay: delay)
因此,可以进行便利扩展:
extension UIView {
class func animate(withDuration duration: TimeInterval, tension: CGFloat, friction: CGFloat, mass: CGFloat = 1.0, delay: TimeInterval = 0, initialSpringVelocity velocity: CGVector = .zero, animations: @escaping () -> Void, completion: ((Bool) -> Void)? = nil) {
let springParameters = UISpringTimingParameters(
mass: mass, stiffness: tension,
damping: friction,
initialVelocity: .init(dx: 0, dy: 1.0)
)
let animator = UIViewPropertyAnimator(duration: duration, timingParameters: springParameters)
animator.addAnimations {
animations()
}
animator.startAnimation(afterDelay: delay)
}
}