iOS-Swift-圆环进度条
用 CAShapeLayer 和 UIBezierPath 贝塞尔曲线实现,每次进度变化时,重新初始化一个 CAShapeLayer 添加到当前 UIView 上。
import Foundation
import UIKit
class CircleProgressView: UIView {
// 灰色静态圆环
var staticLayer: CAShapeLayer!
// 进度可变圆环
var arcLayer: CAShapeLayer!
// 为了显示更精细,进度范围设置为 0 ~ 1000
var progress = 0
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setProgress(_ progress: Int) {
self.progress = progress
setNeedsDisplay()
}
override func draw(_ rect: CGRect) {
if staticLayer == nil {
staticLayer = createLayer(1000, .gray)
}
self.layer.addSublayer(staticLayer)
if arcLayer != nil {
arcLayer.removeFromSuperlayer()
}
arcLayer = createLayer(self.progress, .red)
self.layer.addSublayer(arcLayer)
}
private func createLayer(_ progress: Int, _ color: UIColor) -> CAShapeLayer {
let endAngle = -CGFloat.pi / 2 + (CGFloat.pi * 2) * CGFloat(progress) / 1000
let layer = CAShapeLayer()
layer.lineWidth = 1.5
layer.strokeColor = color.cgColor
layer.fillColor = UIColor.clear.cgColor
let radius = self.bounds.width / 2 - layer.lineWidth
let path = UIBezierPath.init(arcCenter: CGPoint(x: bounds.width / 2, y: bounds.height / 2), radius: radius, startAngle: -CGFloat.pi / 2, endAngle: endAngle, clockwise: true)
layer.path = path.cgPath
return layer
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性