Created
March 23, 2018 08:18
-
-
Save stinger/c435f66c5959557f3e9168b3675ba6ac to your computer and use it in GitHub Desktop.
InfinityLoader swift demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import PlaygroundSupport | |
public class InfinityLoader: UIView { | |
let anim = CAAnimationGroup() | |
//// Drawing Methods | |
lazy var path: UIBezierPath = { | |
let path = UIBezierPath() | |
path.move(to: CGPoint(x: 24.68, y: 13.15)) | |
path.addLine(to: CGPoint(x: 27.21, y: 15.66)) | |
path.addCurve(to: CGPoint(x: 38.63, y: 15.66), controlPoint1: CGPoint(x: 30.36, y: 18.78), controlPoint2: CGPoint(x: 35.48, y: 18.78)) | |
path.addCurve(to: CGPoint(x: 38.63, y: 4.34), controlPoint1: CGPoint(x: 41.79, y: 12.53), controlPoint2: CGPoint(x: 41.79, y: 7.47)) | |
path.addCurve(to: CGPoint(x: 27.21, y: 4.34), controlPoint1: CGPoint(x: 35.48, y: 1.22), controlPoint2: CGPoint(x: 30.36, y: 1.22)) | |
path.addCurve(to: CGPoint(x: 15.79, y: 15.65), controlPoint1: CGPoint(x: 24.05, y: 7.47), controlPoint2: CGPoint(x: 15.79, y: 15.65)) | |
path.addCurve(to: CGPoint(x: 4.37, y: 15.66), controlPoint1: CGPoint(x: 12.64, y: 18.78), controlPoint2: CGPoint(x: 7.52, y: 18.78)) | |
path.addCurve(to: CGPoint(x: 4.37, y: 4.34), controlPoint1: CGPoint(x: 1.21, y: 12.53), controlPoint2: CGPoint(x: 1.21, y: 7.47)) | |
path.addCurve(to: CGPoint(x: 15.79, y: 4.34), controlPoint1: CGPoint(x: 7.52, y: 1.22), controlPoint2: CGPoint(x: 12.64, y: 1.22)) | |
path.addLine(to: CGPoint(x: 18.31, y: 6.84)) | |
return path | |
}() | |
let backgroundPath: UIBezierPath = { | |
let path = UIBezierPath() | |
path.move(to: CGPoint(x: 26.09, y: 11.73)) | |
path.addLine(to: CGPoint(x: 28.62, y: 14.24)) | |
path.addCurve(to: CGPoint(x: 37.23, y: 14.24), controlPoint1: CGPoint(x: 30.99, y: 16.59), controlPoint2: CGPoint(x: 34.85, y: 16.59)) | |
path.addCurve(to: CGPoint(x: 37.23, y: 5.76), controlPoint1: CGPoint(x: 39.59, y: 11.89), controlPoint2: CGPoint(x: 39.59, y: 8.11)) | |
path.addCurve(to: CGPoint(x: 28.62, y: 5.76), controlPoint1: CGPoint(x: 34.85, y: 3.41), controlPoint2: CGPoint(x: 30.99, y: 3.41)) | |
path.addCurve(to: CGPoint(x: 23.51, y: 10.82), controlPoint1: CGPoint(x: 27.53, y: 6.84), controlPoint2: CGPoint(x: 25.76, y: 8.59)) | |
path.addCurve(to: CGPoint(x: 23.51, y: 10.82), controlPoint1: CGPoint(x: 23.51, y: 10.82), controlPoint2: CGPoint(x: 23.51, y: 10.82)) | |
path.addCurve(to: CGPoint(x: 19.17, y: 15.12), controlPoint1: CGPoint(x: 22.13, y: 12.19), controlPoint2: CGPoint(x: 20.65, y: 13.66)) | |
path.addCurve(to: CGPoint(x: 17.74, y: 16.54), controlPoint1: CGPoint(x: 18.34, y: 15.95), controlPoint2: CGPoint(x: 18.34, y: 15.95)) | |
path.addCurve(to: CGPoint(x: 17.2, y: 17.07), controlPoint1: CGPoint(x: 17.3, y: 16.98), controlPoint2: CGPoint(x: 17.3, y: 16.98)) | |
path.addCurve(to: CGPoint(x: 2.96, y: 17.08), controlPoint1: CGPoint(x: 13.27, y: 20.97), controlPoint2: CGPoint(x: 6.89, y: 20.97)) | |
path.addCurve(to: CGPoint(x: 2.96, y: 2.92), controlPoint1: CGPoint(x: -0.99, y: 13.17), controlPoint2: CGPoint(x: -0.99, y: 6.83)) | |
path.addCurve(to: CGPoint(x: 17.2, y: 2.92), controlPoint1: CGPoint(x: 6.89, y: -0.97), controlPoint2: CGPoint(x: 13.27, y: -0.97)) | |
path.addLine(to: CGPoint(x: 19.72, y: 5.42)) | |
path.addLine(to: CGPoint(x: 16.91, y: 8.26)) | |
path.addLine(to: CGPoint(x: 14.39, y: 5.76)) | |
path.addCurve(to: CGPoint(x: 5.77, y: 5.76), controlPoint1: CGPoint(x: 12.01, y: 3.41), controlPoint2: CGPoint(x: 8.15, y: 3.41)) | |
path.addCurve(to: CGPoint(x: 5.77, y: 14.24), controlPoint1: CGPoint(x: 3.41, y: 8.11), controlPoint2: CGPoint(x: 3.41, y: 11.89)) | |
path.addCurve(to: CGPoint(x: 14.39, y: 14.23), controlPoint1: CGPoint(x: 8.15, y: 16.59), controlPoint2: CGPoint(x: 12.01, y: 16.59)) | |
path.addCurve(to: CGPoint(x: 14.93, y: 13.7), controlPoint1: CGPoint(x: 14.48, y: 14.14), controlPoint2: CGPoint(x: 14.48, y: 14.14)) | |
path.addCurve(to: CGPoint(x: 16.36, y: 12.28), controlPoint1: CGPoint(x: 15.52, y: 13.11), controlPoint2: CGPoint(x: 15.52, y: 13.11)) | |
path.addCurve(to: CGPoint(x: 20.69, y: 7.98), controlPoint1: CGPoint(x: 17.84, y: 10.81), controlPoint2: CGPoint(x: 19.31, y: 9.35)) | |
path.addCurve(to: CGPoint(x: 20.7, y: 7.98), controlPoint1: CGPoint(x: 20.69, y: 7.98), controlPoint2: CGPoint(x: 20.69, y: 7.98)) | |
path.addCurve(to: CGPoint(x: 25.8, y: 2.92), controlPoint1: CGPoint(x: 22.95, y: 5.75), controlPoint2: CGPoint(x: 24.71, y: 4)) | |
path.addCurve(to: CGPoint(x: 40.04, y: 2.92), controlPoint1: CGPoint(x: 29.74, y: -0.97), controlPoint2: CGPoint(x: 36.11, y: -0.97)) | |
path.addCurve(to: CGPoint(x: 40.04, y: 17.08), controlPoint1: CGPoint(x: 43.99, y: 6.83), controlPoint2: CGPoint(x: 43.99, y: 13.17)) | |
path.addCurve(to: CGPoint(x: 25.8, y: 17.08), controlPoint1: CGPoint(x: 36.11, y: 20.97), controlPoint2: CGPoint(x: 29.74, y: 20.97)) | |
path.addLine(to: CGPoint(x: 23.27, y: 14.56)) | |
path.addLine(to: CGPoint(x: 26.09, y: 11.73)) | |
path.close() | |
return path | |
}() | |
public override func draw(_ rect: CGRect) { | |
let inf = CAShapeLayer() | |
inf.contentsScale = UIScreen.main.scale | |
inf.path = backgroundPath.cgPath | |
inf.fillColor = UIColor.lightGray.cgColor | |
let animated = CAShapeLayer() | |
animated.contentsScale = UIScreen.main.scale | |
animated.strokeColor = UIColor.darkGray.cgColor | |
animated.lineWidth = 2.0 | |
animated.lineCap = kCALineCapRound | |
animated.fillColor = UIColor.clear.cgColor | |
animated.path = path.cgPath | |
inf.addSublayer(animated) | |
let start = CABasicAnimation(keyPath: "strokeStart") | |
start.fromValue = 0.0 | |
start.toValue = 1.0 | |
start.beginTime = 0.2 | |
start.duration = 1.5 | |
let end = CABasicAnimation(keyPath: "strokeEnd") | |
end.fromValue = 0.0 | |
end.toValue = 1.0 | |
end.duration = 1.5 | |
anim.animations = [start, end] | |
anim.duration = 1.7 | |
anim.repeatCount = Float.greatestFiniteMagnitude | |
anim.isRemovedOnCompletion = false | |
backgroundColor = .clear | |
layer.addSublayer(inf) | |
animated.add(anim, forKey: "pathAnim") | |
} | |
} | |
let rect = CGRect(origin: .zero, size: CGSize(width: 43, height: 20)) | |
let infinity = InfinityLoader(frame: rect) | |
PlaygroundPage.current.liveView = infinity | |
PlaygroundPage.current.needsIndefiniteExecution = true |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment