Skip to content

Instantly share code, notes, and snippets.

@stinger
Created March 23, 2018 08: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 stinger/c435f66c5959557f3e9168b3675ba6ac to your computer and use it in GitHub Desktop.
Save stinger/c435f66c5959557f3e9168b3675ba6ac to your computer and use it in GitHub Desktop.
InfinityLoader swift demo
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