【swift】圆形数据表示百分比
来源:互联网 发布:mac自动关机 时间设置 编辑:程序博客网 时间:2024/05/29 13:56
swift 2.2
import UIKitclass ProgressView: UIView { /// 灰色线条的颜色 var strokelineWidth:CGFloat = 10.0 /// 中间字的大小 var numbelFont = UIFont.systemFontOfSize(18) /// 中间字的颜色 var numbelTextColor = UIColor.blackColor() /// 内部轨道颜色 var interiorRailwayColor = UIColor.lightGrayColor() /// 外部轨道颜色 var exteriorRailwayColor = UIColor.redColor() private var progressValue : CGFloat! private var progressFlag : CGFloat! var labelTimer : NSTimer? lazy var outLayer : CAShapeLayer! = { let Layer = CAShapeLayer() Layer.strokeColor = UIColor.lightGrayColor().CGColor Layer.fillColor = UIColor.clearColor().CGColor Layer.lineCap = kCALineCapRound self.layer.addSublayer(Layer) return Layer }() lazy var progressLayer : CAShapeLayer! = { let layerNew = CAShapeLayer() layerNew.fillColor = UIColor.clearColor().CGColor layerNew.strokeColor = UIColor.redColor().CGColor //progressLayer.lineCap = kCALineCapRound self.layer.addSublayer(layerNew) return layerNew }() lazy var numberLabel : UILabel! = { let numLabelNew = UILabel(frame: CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)) numLabelNew.center = CGPointMake(self.bounds.size.width / 2,self.bounds.size.height/2) numLabelNew.backgroundColor = UIColor.clearColor() numLabelNew.textAlignment = .Center self.addSubview(numLabelNew) return numLabelNew }() override init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = UIColor.whiteColor() } /** 调整绘制图像 - parameter progress: 90 - parameter animate: true or false */ func circleWithProgress(progress: CGFloat,andIsAnimate animate : Bool){ if(animate){ progressFlag = 0 progressValue = progress // 灰色轨道 let path = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0) , endAngle: CGFloat( M_PI * 2) , clockwise: true) self.outLayer.path = path.CGPath self.outLayer.lineWidth = strokelineWidth self.outLayer.strokeColor = interiorRailwayColor.CGColor // run轨道 let path1 = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width/2 - strokelineWidth / 2 - 2.5 , startAngle: -CGFloat(M_PI * 0.5) , endAngle: CGFloat(M_PI * 1.5) , clockwise: true) self.progressLayer.path = path1.CGPath self.progressLayer.lineWidth = strokelineWidth + 5 self.progressLayer.strokeColor = exteriorRailwayColor.CGColor let pathAnima = CABasicAnimation(keyPath: "strokeEnd") pathAnima.duration = Double(progress / 100.0) pathAnima.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) pathAnima.fromValue = NSNumber(float: 0) pathAnima.toValue = NSNumber(float: Float(progress / 100.0)) pathAnima.fillMode = kCAFillModeForwards pathAnima.removedOnCompletion = false self.progressLayer.addAnimation(pathAnima, forKey: "strokeEndAnimation") self.numberLabel.font = numbelFont self.numberLabel.textColor = numbelTextColor if(progress > 0){ labelTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "nameLbChange", userInfo: nil, repeats: true) } }else{ self.numberLabel.text = "\(Int(progress))%" self.numberLabel.font = numbelFont self.numberLabel.textColor = numbelTextColor let path = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0) , endAngle: CGFloat( M_PI * 2) , clockwise: true) self.outLayer.path = path.CGPath self.outLayer.lineWidth = strokelineWidth self.outLayer.strokeColor = interiorRailwayColor.CGColor let path1 = UIBezierPath(arcCenter: CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2), radius: self.bounds.size.width/2 - strokelineWidth / 2 - 2.5 , startAngle: -CGFloat(M_PI * 0.5) , endAngle: CGFloat(M_PI * 1.5) , clockwise: true) self.progressLayer.path = path1.CGPath self.progressLayer.lineWidth = strokelineWidth + 5 self.progressLayer.strokeEnd = progress / 100.0 self.progressLayer.strokeColor = exteriorRailwayColor.CGColor } } /** 定时器走的方法 */ func nameLbChange(){ if(progressFlag >= progressValue - 1){ labelTimer!.invalidate() labelTimer = nil } progressFlag! += CGFloat(1.0) numberLabel.text = "\(Int(progressFlag))%" } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}
swift 3++
import UIKitclass CNCircleProgressView: UIView { /// 灰色线条的颜色 var strokelineWidth:CGFloat = 10.0 /// 中间字的大小 var numbelFont = UIFont.systemFont(ofSize: 18) /// 中间字的颜色 var numbelTextColor = UIColor.black /// 内部轨道颜色 var interiorRailwayColor = UIColor.lightGray /// 外部轨道颜色 var exteriorRailwayColor = UIColor.red /// label定时器 var labelTimer : Timer? /// 总的进度 private var progressValue : CGFloat! /// 累加的进度 private var progressFlag : CGFloat! /// 轨道layer private lazy var interiorRailwayLayer : CAShapeLayer! = { let Layer = CAShapeLayer() Layer.strokeColor = UIColor.lightGray.cgColor Layer.fillColor = UIColor.clear.cgColor Layer.lineCap = kCALineCapRound self.layer.addSublayer(Layer) return Layer }() /// 加载轨道layer private lazy var exteriorRailwayLayer : CAShapeLayer! = { let layerNew = CAShapeLayer() layerNew.fillColor = UIColor.clear.cgColor layerNew.strokeColor = UIColor.red.cgColor //progressLayer.lineCap = kCALineCapRound self.layer.addSublayer(layerNew) return layerNew }() /// 中间显示数字 private lazy var numberLabel : UILabel! = { let numLabelNew = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height)) numLabelNew.center = CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2) numLabelNew.backgroundColor = UIColor.clear numLabelNew.textAlignment = .center self.addSubview(numLabelNew) return numLabelNew }() override init(frame: CGRect) { super.init(frame: frame) self.backgroundColor = UIColor.white } /** 调整绘制图像 - parameter progress: 90 - parameter animate: true or false */ func circleWithProgress(progress: CGFloat,andIsAnimate animate : Bool){ if animate { progressFlag = 0 progressValue = progress let path = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true) self.interiorRailwayLayer.path = path.cgPath self.interiorRailwayLayer.lineWidth = strokelineWidth self.interiorRailwayLayer.strokeColor = interiorRailwayColor.cgColor let pathE = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 2.5, startAngle: -CGFloat(M_PI * 0.5), endAngle: CGFloat(M_PI * 1.5), clockwise: true) self.exteriorRailwayLayer.path = pathE.cgPath self.exteriorRailwayLayer.lineWidth = strokelineWidth + 5 self.exteriorRailwayLayer.strokeColor = exteriorRailwayColor.cgColor let pathAnima = CABasicAnimation(keyPath: "strokeEnd") pathAnima.duration = Double(progress / 100.0) pathAnima.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) pathAnima.fromValue = NSNumber(value: 0) pathAnima.toValue = NSNumber(value: Float(progress / 100.0)) pathAnima.fillMode = kCAFillModeForwards pathAnima.isRemovedOnCompletion = false self.exteriorRailwayLayer.add(pathAnima, forKey: "strokeEndAnimation") self.numberLabel.font = numbelFont self.numberLabel.textColor = numbelTextColor if progress > 0 { labelTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(CNCircleProgressView.nameLbChange), userInfo: nil, repeats: true) } }else{ self.numberLabel.text = "\(Int(progress))%" self.numberLabel.font = numbelFont self.numberLabel.textColor = numbelTextColor let path = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 5, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true) self.interiorRailwayLayer.path = path.cgPath self.interiorRailwayLayer.lineWidth = strokelineWidth self.interiorRailwayLayer.strokeColor = interiorRailwayColor.cgColor let pathE = UIBezierPath(arcCenter: CGPoint(x: self.bounds.size.width / 2, y: self.bounds.size.height/2), radius: self.bounds.size.width / 2 - strokelineWidth / 2 - 2.5, startAngle: -CGFloat(M_PI * 0.5), endAngle: CGFloat(M_PI * 1.5), clockwise: true) self.exteriorRailwayLayer.path = pathE.cgPath self.exteriorRailwayLayer.lineWidth = strokelineWidth + 5 self.exteriorRailwayLayer.strokeColor = exteriorRailwayColor.cgColor self.exteriorRailwayLayer.strokeEnd = progress / 100.0 } } /** 定时器走的方法 */ func nameLbChange(){ if(progressFlag >= progressValue - 1){ labelTimer!.invalidate() labelTimer = nil } progressFlag! += CGFloat(1.0) numberLabel.text = "\(Int(progressFlag))%" } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }}
阅读全文
1 0
- 【swift】圆形数据表示百分比
- canvas圆形百分比
- jQuery圆形百分比图
- jQuery圆形统计图(百分比)
- 自定义圆形进度条,金额百分比
- 动态显示百分比的圆形
- canvas制作圆形百分比统计图
- Android 圆形百分比中间空心
- android_自定义View_圆形百分比显示
- Android 自定义view --圆形百分比(进度条)
- 自定义控件(六)- 百分比圆形
- Android 自定义view --圆形百分比(进度条)
- 圆形百分比进度条(避坑笔记)
- 自定义VIew之圆形百分比效果
- ios AFNetworking 圆形进度条下载,显示百分比
- 如何绘制圆形百分比加载圈
- 【Android自定义view系列】圆形百分比进度条
- 自定义view圆形进度条,并改变百分比。
- kafka+sparkstreaming wordcount
- VC获得显示器状态(捕获息屏/亮屏事件)
- java response 文件下载 文件名 乱码
- mediawiki初探
- Linux开机启动程序详解
- 【swift】圆形数据表示百分比
- Majority Element
- 前端中.alert&&.confirm的区别
- 【caffe源代码的梳理之三】Net
- 八皇后问题
- 指针与内存基础
- Networking --最小生成树
- “身份证打印”软件上线了
- 符号三角形