- Unified set of easing functions
- Easy-to-use 'swifty' API to invoke calculations
- Interpolation shorthands for commonly used types like
CGPoint
,CGSize
,CGTransform
,UIColor
andUIBezierPath
- Arbitrary cubic bezier based easings (see
.cubicBezier(...)
) - Emulate default easings from iOS (see
.caEaseIn
,.caEaseOut
,.caEaseInEaseOut
) - Interactive demo app
- Supports iOS 12.0+ / Mac OS X 10.13+ / tvOS 12.0+ / watchOS 4.0+ / visionOS 1.0+
let startValue = 20.0
let endValue = 60.0
let progress = 0.5 // Assume a progress variable that ranges from 0 to 1
let valueAtProgress = Easing.cubicEaseIn.calculate(
d1: startValue,
d2: endValue,
g: progress
)
Imagine an interaction with a UIScrollView
where its header is fully visible when the content offset is zero and fades out completely as the content offset exceeds 100 points. You can express this behavior with the following code in your scrollViewDidScroll
method:
let minOffset = 0.0
let alphaForMinOffset = 0.0
let maxOffset = 100.0
let alphaForMaxOffset = 1.0
let offset = scrollView.contentOffset.y
headerView.alpha = Easing.quadraticEaseInOut.calculate(
g1: minOffset,
d1: alphaForMinOffset,
g2: maxOffset,
d2: alphaForMaxOffset,
g: offset
)
let startTransform = CGAffineTransform.identity
let endTransform = CGAffineTransform(scaleX: 2, y: 2)
let progress = 0.5 // Assume a progress variable that ranges from 0 to 1
view.transform = startTransform.interpolate(to: endTransform,
progress: progress,
easing: .linear)
In the repo, you will find an interactive demo iOS app to experiment with different easings and discover the most suitable one for your needs.
Use Swift Package Manager and add dependency to Package.swift
file.
dependencies: [
.package(url: "https://github.com/psharanda/Easing.git", .upToNextMajor(from: "3.0.0"))
]
Alternatively, in Xcode select File > Add Package Dependencies…
and add Easing repository URL:
https://github.com/psharanda/Easing.git
The main set of easing functions is a Swift port of https://github.com/warrenm/AHEasing and https://github.com/ai/easings.net
CubicBezierInterpolator
is a Swift port of nsSMILKeySpline
code from Mozilla https://github.com/mozilla-services/services-central-legacy/blob/master/content/smil/nsSMILKeySpline.cpp
We welcome contributions! If you find a bug, have a feature request, or want to contribute code, please open an issue or submit a pull request.
Easing is available under the MIT license. See the LICENSE file for more info.