Skip to content

Instantly share code, notes, and snippets.

@SebastianOsinski
Created February 22, 2018 12:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SebastianOsinski/c20900783ba703baa9ae8acc0bcd5998 to your computer and use it in GitHub Desktop.
Save SebastianOsinski/c20900783ba703baa9ae8acc0bcd5998 to your computer and use it in GitHub Desktop.
Thin wrapper for UIView.animateKeyframes
import UIKit
final class KeyframeAnimator {
private struct AnimationsData {
let animations: Animations
let relativeTimeStart: Double
let relativeDuration: Double
}
typealias Animations = () -> Void
private var animationsDataList = [AnimationsData]()
func addKeyframe(withRelativeStartTime relativeStartTime: Double, relativeDuration: Double, animations: @escaping Animations) -> KeyframeAnimator {
let data = AnimationsData(
animations: animations,
relativeTimeStart: relativeStartTime,
relativeDuration: relativeDuration
)
animationsDataList.append(data)
return self
}
func animate(withDuration duration: TimeInterval, delay: TimeInterval = 0.0, options: UIViewKeyframeAnimationOptions = [], completion: ((Bool) -> Void)? = nil) {
UIView.animateKeyframes(
withDuration: duration,
delay: delay,
options: options,
animations: { [animationsDataList] in
for data in animationsDataList {
UIView.addKeyframe(
withRelativeStartTime: data.relativeTimeStart,
relativeDuration: data.relativeDuration,
animations: data.animations
)
}
},
completion: completion
)
animationsDataList = []
}
}
extension UIView {
static var keyframeAnimator: KeyframeAnimator {
return KeyframeAnimator()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment