curent working order

This commit is contained in:
Kevin G Christiano 2020-05-21 10:44:21 -04:00
parent ee5f0dfdc2
commit 898877a051

View File

@ -58,28 +58,23 @@ open class LoadingSpinner: View {
} }
struct Pose { struct Pose {
let secondsSincePriorPose: CFTimeInterval let delay: CFTimeInterval
let start: CGFloat let start: CGFloat
let length: CGFloat let length: CGFloat
init(_ secondsSincePriorPose: CFTimeInterval, _ start: CGFloat, _ length: CGFloat) {
self.secondsSincePriorPose = secondsSincePriorPose
self.start = start
self.length = length
}
} }
// TODO: This needs more attention // TODO: This needs more attention
class var poses: [Pose] { class var poses: [Pose] {
get { get {
return [ return [
Pose(0.0, 0.000, 0.7), Pose(delay: 0.0, start: 0.000, length: 0.7),
Pose(0.7, 0.500, 0.5), Pose(delay: 0.7, start: 0.500, length: 0.5),
Pose(0.6, 1.000, 0.3), Pose(delay: 0.6, start: 1.000, length: 0.3),
Pose(0.4, 1.500, 0.2), Pose(delay: 0.5, start: 1.500, length: 0.2),
Pose(0.3, 1.875, 0.2), Pose(delay: 0.4, start: 1.875, length: 0.2),
Pose(0.3, 2.250, 0.3), Pose(delay: 0.3, start: 2.250, length: 0.3),
Pose(0.2, 2.625, 0.5), Pose(delay: 0.2, start: 2.600, length: 0.5),
Pose(0.2, 3.000, 0.7) Pose(delay: 0.2, start: 3.000, length: 0.7)
] ]
} }
} }
@ -92,19 +87,19 @@ open class LoadingSpinner: View {
var strokeEnds = [CGFloat]() var strokeEnds = [CGFloat]()
let poses = Self.poses let poses = Self.poses
let totalSeconds = poses.reduce(0) { $0 + $1.secondsSincePriorPose } let totalSeconds = poses.reduce(0) { $0 + $1.delay }
for pose in poses { for pose in poses {
time += pose.secondsSincePriorPose time += pose.delay
times.append(time / totalSeconds) times.append(time / totalSeconds)
start = pose.start start = pose.start
rotations.append(start * 2 * CGFloat.pi) rotations.append(start * 2 * CGFloat.pi)
strokeEnds.append(pose.length) strokeEnds.append(pose.length)
} }
times.append(times.last!) // times.append(times.last ?? 1)
rotations.append(rotations[0]) // rotations.append(rotations[0])
strokeEnds.append(strokeEnds[0]) // strokeEnds.append(strokeEnds[0])
animateKeyPath(keyPath: "strokeEnd", duration: totalSeconds, times: times, values: strokeEnds) animateKeyPath(keyPath: "strokeEnd", duration: totalSeconds, times: times, values: strokeEnds)
animateKeyPath(keyPath: "transform.rotation", duration: totalSeconds, times: times, values: rotations) animateKeyPath(keyPath: "transform.rotation", duration: totalSeconds, times: times, values: rotations)
@ -116,6 +111,7 @@ open class LoadingSpinner: View {
animation.keyTimes = times as [NSNumber]? animation.keyTimes = times as [NSNumber]?
animation.values = values animation.values = values
animation.calculationMode = .linear animation.calculationMode = .linear
animation.timingFunction = CAMediaTimingFunction(name: .linear)
animation.duration = duration animation.duration = duration
animation.rotationMode = .rotateAuto animation.rotationMode = .rotateAuto
animation.fillMode = .forwards animation.fillMode = .forwards
@ -136,6 +132,7 @@ open class LoadingSpinner: View {
} }
func pauseAnimations() { func pauseAnimations() {
let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil) let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0 layer.speed = 0
isHidden = true isHidden = true
@ -143,6 +140,7 @@ open class LoadingSpinner: View {
} }
func resumeAnimations() { func resumeAnimations() {
let pausedTime = layer.timeOffset let pausedTime = layer.timeOffset
isHidden = false isHidden = false
layer.speed = speed layer.speed = speed
@ -153,11 +151,14 @@ open class LoadingSpinner: View {
} }
func stopAllAnimations() { func stopAllAnimations() {
layer.removeAllAnimations() layer.removeAllAnimations()
} }
func pinWidthAndHeight(radius: CGFloat) { func pinWidthAndHeight(radius: CGFloat) {
let diameter: CGFloat = radius * 2 + lineWidth let diameter: CGFloat = radius * 2 + lineWidth
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
heightAnchor.constraint(equalToConstant: diameter), heightAnchor.constraint(equalToConstant: diameter),
widthAnchor.constraint(equalToConstant: diameter) widthAnchor.constraint(equalToConstant: diameter)