Implementation of Flinto's spring
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Implementation of Flinto for Mac's spring.

User groups / twitter:

How to use

To reproduce spring values created in Flinto for Mac, use RK4SpringAnimation in RK4Spring.swift.

public func RK4SpringAnimation(tension tension:Double, friction:Double, initialVelocity:Double, delta:Double = 1/60.0) -> [Double]

  • tension should be between 5.0 to 1000.0.
  • friction should be between 5.0 to 100.0.
  • initialVelocity should be between -100.0 to 100.0.
  • delta is optional and only 1/60 is supported at this moment.

initialVelocity value is usually 0 in You can supply velocity values into spring by using UIPanGestureRecognizer's velocityInView: method. It's a unit coordinate system, where 1 is defined as travelling the total animation distance in a second. So if you're changing an object's position by 200px in this animation, and velocityInView returns 100 (means 100px/s), you'd pass 0.5.

The return values are sample values between 0.0 to 1.0, and one sample duration is 1/60 second. Therefore, if you want to move a layer from Y=0 to Y=100, you should multiply the values by 100 and set duration to Double(values.count) * 1 / 60.0. The code with CAKeyframeAnimation would look like the following:

let values = RK4SpringAnimation(tension: tension, friction: friction, initialVelocity: velocity)
let positions = {$0 * 100}

let anim = CAKeyframeAnimation(keyPath: "position.y")
anim.values = positions
anim.duration = Double(values.count) * 1 / 60.0

layer.add(anim, forKey: "spring")
layer.setValue(NSNumber(value: 100.0 as Double), forKey: "position.y")