CircularProgressView

本文介绍了一个使用Swift开发的CircularProgressView组件,该组件用于在iOS应用中显示圆形进度条。通过定制其属性,开发者可以轻松调整进度条的颜色、宽度以及进度百分比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
//  CircularProgressView.swift
//  CircularProgressView
//
//  Created by Chris Amanse on 5/2/15.
//  Copyright (c) 2015 Joe Christopher Paul Amanse. All rights reserved.
//

import UIKit

@IBDesignable
class CircularProgressView: UIView {
    // MARK: - Layers
    
    let trackLayer: CAShapeLayer = CAShapeLayer()
    let progressLayer: CAShapeLayer = CAShapeLayer()
    
    // MARK: - Properties
    
    @IBInspectable var trackWidth: CGFloat = 5.0 {
        didSet {
            redrawTrackSublayer()
            redrawProgressSublayer()
        }
    }
    
    @IBInspectable var trackColor: UIColor = UIColor.darkGrayColor() {
        didSet {
            trackLayer.strokeColor = trackColor.CGColor
        }
    }
    @IBInspectable var progressColor: UIColor = UIColor.lightGrayColor() {
        didSet {
            progressLayer.strokeColor = progressColor.CGColor
        }
    }
    @IBInspectable var progress: Double = 0 {
        didSet {
            redrawProgressSublayer()
        }
    }
    
    // MARK: - Drawing
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // Redraw layers to keep center and proportional
        redrawTrackSublayer()
        redrawProgressSublayer()
    }
    
    func redrawTrackSublayer() {
        let frameWidth = frame.width
        let frameHeight = frame.height
        let side: CGFloat = (frameWidth < frameHeight) ? frameWidth : frameHeight
        let trackCenter = CGPoint(x: frameWidth / 2, y: frameHeight / 2)
        
        let radius = (side - trackWidth) / 2
        let trackPath = UIBezierPath()
        trackPath.moveToPoint(CGPoint(x: trackCenter.x + radius, y: trackCenter.y))
        trackPath.addArcWithCenter(trackCenter, radius: radius, startAngle: 0, endAngle: CGFloat(2 * M_PI), clockwise: true)

        trackLayer.path = trackPath.CGPath
        trackLayer.lineWidth = trackWidth
    }
    
    func redrawProgressSublayer() {
        let frameWidth = frame.width
        let frameHeight = frame.height
        let side: CGFloat = (frameWidth < frameHeight) ? frameWidth : frameHeight
        let trackCenter = CGPoint(x: frameWidth / 2, y: frameHeight / 2)
        
        let radius = (side - trackWidth) / 2
        let progressPath = UIBezierPath()
        progressPath.moveToPoint(CGPoint(x: trackCenter.x, y: trackCenter.y - radius))
        progressPath.addArcWithCenter(trackCenter, radius: radius, startAngle: CGFloat(-M_PI_2), endAngle: CGFloat(progress*2*M_PI - M_PI_2), clockwise: true)
        
        progressLayer.path = progressPath.CGPath
        progressLayer.lineWidth = trackWidth
    }
    
    // MARK: - Initialization
    
    func commonInitialization() {
        // Add track layer
        trackLayer.opacity = 1
        trackLayer.strokeColor = trackColor.CGColor
        trackLayer.fillColor = nil
        layer.addSublayer(trackLayer)
        
        // Add progress layer
        progressLayer.opacity = 1
        progressLayer.strokeColor = progressColor.CGColor
        progressLayer.fillColor = nil
        layer.addSublayer(progressLayer)
    }
    
    // MARK: Live Render IB
    override func prepareForInterfaceBuilder() {
        commonInitialization()
    }
    
    // MARK: IB load
    override func awakeFromNib() {
        commonInitialization()
    }
    
    // MARK: Programmatic
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        // Initialize sublayers
        commonInitialization()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    convenience init(frame: CGRect, trackWidth: CGFloat, progress: Double) {
        self.init(frame: frame)
        self.trackWidth = trackWidth
        self.progress = progress
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值