DemoProjects/NowPlayingView/NowPlayingView/ConnectionStatusIndicatorView.swift (52 lines of code) (raw):
import UIKit
/// Connection status view
class ConnectionStatusIndicatorView : UIView {
enum State {
case disconnected
case connecting
case connected
}
var state: State = .disconnected {
didSet {
self.setNeedsDisplay()
if state == .connecting {
if displayLink == nil {
let selector = #selector(setNeedsDisplay as () -> Void)
displayLink = CADisplayLink(target: self, selector:selector)
}
displayLink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
} else {
displayLink?.remove(from: RunLoop.main, forMode: RunLoop.Mode.common)
displayLink = nil;
}
}
}
var displayLink: CADisplayLink?
override func didMoveToSuperview() {
super.didMoveToSuperview()
self.clearsContextBeforeDrawing = true;
self.backgroundColor = UIColor.clear
}
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else {
return
}
let size = self.bounds.size
let path = CGPath(roundedRect: self.bounds, cornerWidth: size.width/2, cornerHeight: size.height/2, transform: nil)
context.addPath(path)
context.setFillColor(fillColor())
context.fillPath()
}
private func timebasedValue() -> CGFloat {
return CGFloat(abs(sin(Date().timeIntervalSinceReferenceDate*4)))
}
private func fillColor() -> CGColor {
switch state {
case .disconnected:
return UIColor.red.cgColor
case .connecting:
return UIColor.orange.withAlphaComponent(0.5+timebasedValue()*0.3).cgColor
case .connected:
return UIColor.green.cgColor
}
}
}