2

我有一个弹簧动画曲线,使用UISpringTimingParameters带有阻尼比和初始速度的 a 指定,我将它与 aUIViewPropertyAnimator一起使用,并指定了它的持续时间。在我的应用程序的其他地方,我需要使用CASpringAnimation. 但CASpringAnimation不能仅使用阻尼比和 initialVelocity 进行初始化 - 它需要所有不同的弹簧参数并从中派生settlingDuration

给定持续时间、阻尼比和初始速度矢量,我如何创建一个CASpringAnimation

4

2 回答 2

0

我在一篇博文中找到了答案。简而言之:

let spring = CASpringAnimation(keyPath: somePropertyPath)

//Set initial velocity and desired duration
let initialVelocity: CGFloat = desiredInitialVelocity
let relaxationTime: CGFloat = desiredDurationInSeconds

//Spring constants
let dampingRatio: CGFloat = 0.9
//Only allow damping ratio between just above 0 and 1 (critically damped)
let clippedDampingRatio: CGFloat = min(1, max(dampingRatio, 0.01))
let mass: CGFloat = 1
let fractionOfAmplitude: CGFloat = 1500 //A spring never gets to 0 amplitude, it gets infinitely smaller. This fraction represents the perceived 0 point.
let logOfFraction: CGFloat = log(fractionOfAmplitude)
let stiffness: CGFloat = (mass * pow(logOfFraction, 2)) / (pow(relaxationTime, 2) * pow(clippedDampingRatio, 2))
let angularFrequency: CGFloat = sqrt(stiffness/mass)
let damping: CGFloat = 2 * mass * angularFrequency * clippedDampingRatio

spring.initialVelocity = initialVelocity
spring.mass = mass
spring.stiffness = stiffness
spring.damping = damping
于 2020-05-12T22:51:25.410 回答
0

抱歉,我无法帮助您计算数学,但也许您可以使用虚拟属性动画师来计算您需要的内容?见https://developer.apple.com/videos/play/wwdc2016/216/?time=2521

func animationDuration() -> TimeInterval {
    return propertyAnimator().duration
}

func propertyAnimator(initialVelocity: CGVector = .zero) -> UIViewPropertyAnimator {
    let timingParameters = UISpringTimingParameters(mass: 4.5, stiffness: 1300, damping: 95, initialVelocity: initialVelocity)
    return UIViewPropertyAnimator(duration: assetTransitionDuration, timingParameters:timingParameters)
}
于 2020-04-08T01:51:16.150 回答