// Copyright © 2021 Metabolist. All rights reserved. import UIKit final class LineChartView: UIView { var values = [Int]() { didSet { setNeedsDisplay() } } override init(frame: CGRect) { super.init(frame: frame) backgroundColor = .clear } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override var intrinsicContentSize: CGSize { UIView.layoutFittingExpandedSize } override func draw(_ rect: CGRect) { let path = UIBezierPath() path.lineWidth = Self.lineWidth path.lineCapStyle = .round let valueCount = values.count guard valueCount > 0, let maxValue = values.max() else { return } let inset = Self.lineWidth / 2 for (index, value) in values.enumerated() { let x = CGFloat(index) / CGFloat(valueCount) * rect.width let y = rect.height - CGFloat(value) / max(CGFloat(maxValue), CGFloat(0).nextUp) * rect.height let point = CGPoint( x: min(max(x, inset), rect.width - inset), y: min(max(y, inset), rect.height - inset)) if index > 0 { path.addLine(to: point) } path.move(to: point) } path.close() UIColor.link.setStroke() path.stroke() } } private extension LineChartView { static let lineWidth: CGFloat = 2 }