// // CircleProgressView.swift // Twear // // Created by yangbin on 2021/12/30. // import UIKit class CircleProgressView: UIView { private lazy var bgLayer: CAShapeLayer = CAShapeLayer() // 延迟初始化进度条层,采用 stroke 来绘制边框 private lazy var progressLayer: CAShapeLayer = CAShapeLayer() var value: Int = 0 { didSet { progressLayer.strokeEnd = CGFloat(value)/100 } } @IBOutlet weak var label: UILabel! override init(frame: CGRect) { super.init(frame: frame) initFromNib() setupUI() } required init?(coder: NSCoder) { super.init(coder: coder) initFromNib() setupUI() } override class func awakeFromNib() { super.awakeFromNib() } private func setupUI() { // 0.25 透明度的白色背景 bgLayer.fillColor = LineColor.cgColor layer.addSublayer(bgLayer) // 边框全白,边框宽度为 4 progressLayer = CAShapeLayer() progressLayer.fillColor = nil progressLayer.strokeColor = UIColor.rgbColorFromHex(0x1DDCC5).cgColor progressLayer.lineWidth = self.frame.width/2 layer.addSublayer(progressLayer) let radius = bounds.width / 2 bgLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: bounds.width, height: bounds.width), cornerRadius: radius).cgPath // 设置 start 从 12点钟方向开始(默认是3点钟方向) // end = 360度 * progress - start // 设置为 顺时针 方向 let end = CGFloat(Double.pi * 2) - CGFloat(Double.pi / 2) progressLayer.path = UIBezierPath(arcCenter: CGPoint(x: radius, y: radius), radius: radius/2, startAngle: -CGFloat(Double.pi / 2), endAngle: end, clockwise: true).cgPath progressLayer.strokeEnd = 0 } private func initFromNib() { if let view = UINib(nibName: "CircleProgressView", bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil).first as? UIView { view.frame = bounds self.addSubview(view) } } override func layoutSubviews() { refreshUI() } private func refreshUI() { } /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func draw(_ rect: CGRect) { // Drawing code } */ }