Skip to content

Instantly share code, notes, and snippets.

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 CodingMeSwiftly/fe075230d9a5b69ee17b9d6bdc644bf7 to your computer and use it in GitHub Desktop.
Save CodingMeSwiftly/fe075230d9a5b69ee17b9d6bdc644bf7 to your computer and use it in GitHub Desktop.
An extension on CAMediaTimingFunction to enable interoperability with UIViewProtertyAnimator
import UIKit
import QuartzCore
//MARK: - NSCopying
extension CAMediaTimingFunction: NSCopying {
public func copy(with zone: NSZone? = nil) -> Any {
let c1 = controlPoint1
let c2 = controlPoint2
return CAMediaTimingFunction(controlPoints: Float(c1.x), Float(c1.y), Float(c2.x), Float(c2.y))
}
}
//MARK: - UITimingCurveProvider
@available(iOS 10.0, *)
extension CAMediaTimingFunction: UITimingCurveProvider {
public var timingCurveType: UITimingCurveType {
return .cubic
}
public var cubicTimingParameters: UICubicTimingParameters? {
return UICubicTimingParameters(controlPoint1: controlPoint1, controlPoint2: controlPoint2)
}
public var springTimingParameters: UISpringTimingParameters? {
return nil
}
}
//MARK: - Helpers
fileprivate extension CAMediaTimingFunction {
var controlPoint1: CGPoint {
return controlPoint(at: 1)
}
var controlPoint2: CGPoint {
return controlPoint(at: 2)
}
private func controlPoint(at index: Int) -> CGPoint {
var c: [Float] = [0, 0]
getControlPoint(at: index, values: &c)
return CGPoint(x: CGFloat(c[0]), y: CGFloat(c[1]))
}
}
//MARK: - UIViewPropertyAnimator + CAMediaTimingFunction
@available(iOS 10.0, *)
extension UIViewPropertyAnimator {
convenience init(duration: TimeInterval, timingFunction: CAMediaTimingFunction) {
self.init(duration: duration, timingParameters: timingFunction)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment