CircleProgressView.swift 2.59 KB
//
//  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
    }
    */

}