// // KHFileStorageView.swift // Free Space // // Created by Kyle Howells on 05/05/2022. // import Foundation import UIKit class KHFileStorageView: UIView { // MARK: - Properties var totalSpace:Int64 = 100 { didSet { self.update() } } var usedSpace:Int64 = 50 { didSet { self.update() } } let byteFormatter:ByteCountFormatter = { let formatter = ByteCountFormatter() formatter.allowedUnits = .useAll formatter.countStyle = .file formatter.includesUnit = true formatter.isAdaptive = true return formatter }() // MARK: - Views let usedBackgroundView:UIView = { let view = UIView() view.backgroundColor = UIColor(red: 44.0/255.0, green: 67.0/255.0, blue: 136.0/255.0, alpha: 1.0) return view }() let usedSpaceLabel:UILabel = { let l = UILabel() l.textColor = UIColor(red: 44.0/255.0, green: 67.0/255.0, blue: 136.0/255.0, alpha: 1.0) l.font = UIFont.systemFont(ofSize: 13, weight: .medium) return l }() let freeBackgroundView:UIView = { let view = UIView() view.backgroundColor = UIColor(red: 206.0/255.0, green: 206.0/255.0, blue: 207.0/255.0, alpha: 1.0) return view }() let freeSpaceLabel:UILabel = { let l = UILabel() l.textColor = UIColor(red: 206.0/255.0, green: 206.0/255.0, blue: 207.0/255.0, alpha: 1.0) l.font = UIFont.systemFont(ofSize: 13, weight: .medium) return l }() // MARK: - Setup override init(frame: CGRect) { super.init(frame: frame) self.commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) self.commonInit() } func commonInit() { self.addSubview(self.freeSpaceLabel) self.addSubview(self.freeBackgroundView) self.addSubview(self.usedSpaceLabel) self.addSubview(self.usedBackgroundView) } private func update() { let usedSpaceString = self.byteFormatter.string(fromByteCount: self.usedSpace) self.usedSpaceLabel.text = "Used: \(usedSpaceString)" let freeSpaceString = self.byteFormatter.string(fromByteCount: self.totalSpace - self.usedSpace) self.freeSpaceLabel.text = "Free: \(freeSpaceString)" self.setNeedsLayout() } // MARK: - Size private let barHeight:CGFloat = 30 override func sizeThatFits(_ size: CGSize) -> CGSize { return CGSize(width: size.width, height: self.barHeight + self.freeSpaceLabel.font.lineHeight) } override var intrinsicContentSize: CGSize { return CGSize( width: 320, height: self.barHeight + self.freeSpaceLabel.font.lineHeight ) } // MARK: - Layout override func layoutSubviews() { super.layoutSubviews() let size = self.bounds.size let usedPercent = CGFloat(self.usedSpace) / CGFloat(self.totalSpace) let usedSpaceWidth = size.width * usedPercent self.usedBackgroundView.frame = { var frame = CGRect() frame.size.width = usedSpaceWidth frame.size.height = self.barHeight frame.origin.x = 0 frame.origin.y = 0 return frame }() self.usedSpaceLabel.frame = { var frame = CGRect() frame.size = self.usedSpaceLabel.intrinsicContentSize frame.origin.x = 0 frame.origin.y = self.usedBackgroundView.frame.maxY return frame }() let freePercent = CGFloat(self.totalSpace - self.usedSpace) / CGFloat(self.totalSpace) let freeSpaceWidth = size.width * freePercent self.freeBackgroundView.frame = { var frame = CGRect() frame.size.width = freeSpaceWidth frame.size.height = self.barHeight frame.origin.x = size.width - frame.width frame.origin.y = 0 return frame }() self.freeSpaceLabel.frame = { var frame = CGRect() frame.size = self.freeSpaceLabel.intrinsicContentSize frame.origin.x = size.width - frame.width frame.origin.y = self.freeBackgroundView.frame.maxY return frame }() } }