-
Notifications
You must be signed in to change notification settings - Fork 0
/
EasingFunction.swift
127 lines (118 loc) · 4.48 KB
/
EasingFunction.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//
// EasingFunction.swift
// EasingFunction
//
// Created by Assin on 2019. 9. 17..
// Copyright © 2019 Assin. All rights reserved.
//
import UIKit
public enum EasingFunction {
case easeInSine
case easeOutSine
case easeInOutSine
case easeInQuad
case easeOutQuad
case easeInOutQuad
case easeInCubic
case easeOutCubic
case easeInOutCubic
case easeInQuart
case easeOutQuart
case easeInOutQuart
case easeInQuint
case easeOutQuint
case easeInOutQuint
case easeInExpo
case easeOutExpo
case easeInOutExpo
case easeInCirc
case easeOutCirc
case easeInOutCirc
case easeInBack
case easeOutBack
case easeInOutBack
}
extension EasingFunction: CaseIterable { }
// swiftlint:disable switch_case_on_newline
extension EasingFunction: RawRepresentable, CustomStringConvertible {
public var description: String {
switch self {
case .easeInSine: return "easeInSine"
case .easeOutSine: return "easeOutSine"
case .easeInOutSine: return "easeInOutSine"
case .easeInQuad: return "easeInQuad"
case .easeOutQuad: return "easeOutQuad"
case .easeInOutQuad: return "easeInOutQuad"
case .easeInCubic: return "easeInCubic"
case .easeOutCubic: return "easeOutCubic"
case .easeInOutCubic: return "easeInOutCubic"
case .easeInQuart: return "easeInQuart"
case .easeOutQuart: return "easeOutQuart"
case .easeInOutQuart: return "easeInOutQuart"
case .easeInQuint: return "easeInQuint"
case .easeOutQuint: return "easeOutQuint"
case .easeInOutQuint: return "easeInOutQuint"
case .easeInExpo: return "easeInExpo"
case .easeOutExpo: return "easeOutExpo"
case .easeInOutExpo: return "easeInOutExpo"
case .easeInCirc: return "easeInCirc"
case .easeOutCirc: return "easeOutCirc"
case .easeInOutCirc: return "easeInOutCirc"
case .easeInBack: return "easeInBack"
case .easeOutBack: return "easeOutBack"
case .easeInOutBack: return "easeInOutBack"
}
}
public typealias RawValue = (CGFloat, CGFloat, CGFloat, CGFloat)
public init?(rawValue: RawValue) {
switch rawValue {
default: return nil
}
}
public var rawValue: RawValue {
switch self {
case .easeInSine: return (0.47, 0, 0.745, 0.715)
case .easeOutSine: return (0.39, 0.575, 0.565, 1)
case .easeInOutSine: return (0.445, 0.05, 0.55, 0.95)
case .easeInQuad: return (0.55, 0.085, 0.68, 0.53)
case .easeOutQuad: return (0.25, 0.46, 0.45, 0.94)
case .easeInOutQuad: return (0.455, 0.03, 0.515, 0.955)
case .easeInCubic: return (0.55, 0.055, 0.675, 0.19)
case .easeOutCubic: return (0.215, 0.61, 0.355, 1)
case .easeInOutCubic: return (0.645, 0.045, 0.355, 1)
case .easeInQuart: return (0.895, 0.03, 0.685, 0.22)
case .easeOutQuart: return (0.165, 0.84, 0.44, 1)
case .easeInOutQuart: return (0.77, 0, 0.175, 1)
case .easeInQuint: return (0.755, 0.05, 0.855, 0.06)
case .easeOutQuint: return (0.23, 1, 0.32, 1)
case .easeInOutQuint: return (0.86, 0, 0.07, 1)
case .easeInExpo: return (0.95, 0.05, 0.795, 0.035)
case .easeOutExpo: return (0.19, 1, 0.22, 1)
case .easeInOutExpo: return (1, 0, 0, 1)
case .easeInCirc: return (0.6, 0.04, 0.98, 0.335)
case .easeOutCirc: return (0.075, 0.82, 0.165, 1)
case .easeInOutCirc: return (0.785, 0.135, 0.15, 0.86)
case .easeInBack: return (0.6, -0.28, 0.735, 0.045)
case .easeOutBack: return (0.175, 0.885, 0.32, 1.275)
case .easeInOutBack: return (0.68, -0.55, 0.265, 1.55)
}
}
public func asUICubicTimingParameters() -> UICubicTimingParameters {
return UICubicTimingParameters(self.rawValue)
}
public func asCAMediaTimingFunction() -> CAMediaTimingFunction {
return CAMediaTimingFunction(self.rawValue)
}
}
extension UICubicTimingParameters {
// swiftlint:disable large_tuple
public convenience init(_ param: (CGFloat, CGFloat, CGFloat, CGFloat)) {
self.init(controlPoint1: CGPoint(x: param.0, y: param.1), controlPoint2: CGPoint(x: param.2, y: param.3))
}
}
extension CAMediaTimingFunction {
// swiftlint:disable large_tuple
public convenience init(_ param: (CGFloat, CGFloat, CGFloat, CGFloat)) {
self.init(controlPoints: Float(param.0), Float(param.1), Float(param.2), Float(param.3))
}
}