1 //
2 // ViewController.swift
3 // CAlayerTest
4 //
5 // Created by 杨琴 on 2019/8/13.
6 // Copyright © 2019 AYQ. All rights reserved.
7 //
8
9 import UIKit
10 import QuartzCore
11
12
13 class ViewController: UIViewController {
14
15 let layerOne = ProgressOneLayer()
16 let layerTwo = ProgressTwoLayer()
17 let layerThree = ProgressThreeLayer()
18 let layerFour = ProgressFourLayer()
19
20 let slider = UISlider (frame: CGRect.zero)
21
22
23
24
25
26 override func viewDidLoad() {
27 super.viewDidLoad()
28
29 self.view.backgroundColor = UIColor.white
30
31 self.view.addSubview(self.slider)
32
33 self.slider.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged)
34 self.view.layer.addSublayer(layerOne)
35 self.layerOne.number = 0.0
36
37 self.view.layer.addSublayer(layerTwo)
38 self.layerTwo.number = 0.0
39
40 self.view.layer.addSublayer(layerThree)
41 self.layerThree.number = 0.0
42
43 self.view.layer.addSublayer(layerFour)
44 self.layerFour.number = 0.0
45
46
47
48 // Do any additional setup after loading the view.
49 }
50
51 override func didReceiveMemoryWarning() {
52
53 super.didReceiveMemoryWarning()
54
55 }
56
57
58 override func viewDidLayoutSubviews() {
59
60 super.viewDidLayoutSubviews()
61 self.slider.frame = CGRect (x: 50, y: 70, width: self.view.frame.width-100, height: 30)
62
63 let lWH : CGFloat = 100
64
65 let horSpace = (self.view.frame.width - 2*lWH)/3
66
67 self.layerOne.frame = CGRect (x: horSpace, y: 110, width:lWH , height: lWH)
68 self.layerTwo.frame = CGRect (x: horSpace*2+lWH, y: 110, width:lWH , height: lWH)
69 self.layerThree.frame = CGRect (x: horSpace, y: 110+lWH+30, width:lWH , height: lWH)
70 self.layerFour.frame = CGRect (x: horSpace*2+lWH, y: 110+lWH+30, width:lWH , height: lWH)
71
72
73 }
74
75 @objc func sliderValueChanged(){
76
77 self.layerOne.number = Double(self.slider.value)
78 self.layerTwo.number = Double(self.slider.value)
79 self.layerThree.number = Double(self.slider.value)
80 self.layerFour.number = Double(self.slider.value)
81
82
83 }
84
85 }
86 //圆形进度条的父类,用于显示百分比文本
87 class ProgressLayer: CALayer {
88
89 var number : Double = 0.0 {
90
91 didSet{
92 self.tLayer.string = String (format : "%.2f", number*100 )
93 self.tLayer.setNeedsDisplay()
94 self.setNeedsDisplay()
95 }
96 }
97
98
99
100 override func draw(in ctx: CGContext) {
101
102
103 }
104
105
106 //用于显示字符串的layer
107 let tLayer : CATextLayer = {
108
109 let l = CATextLayer ()
110
111
112 let font = UIFont.systemFont(ofSize: 12)
113 l.font = font.pointSize as CFTypeRef
114 l.alignmentMode = CATextLayerAlignmentMode.center
115 l.foregroundColor = UIColor.black.cgColor
116 l.contentsScale = UIScreen.main.scale
117 l.isWrapped = false
118 l.string = ""
119 return l
120
121
122 }()
123
124 override init() {
125 super.init()
126 self.addSublayer(tLayer)
127 }
128
129 override init(layer: Any) {
130
131 super.init(layer: layer)
132 }
133
134 required init?(coder aDecoder: NSCoder) {
135 fatalError("init(coder:) has not been implemented")
136 }
137
138
139 override func layoutSublayers() {
140
141 super.layoutSublayers()
142
143
144 //计算出字符串的高度
145 let tH = NSString (string: "100%").boundingRect(with: CGSize(width: CGFloat.infinity, height: CGFloat.infinity), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font:UIFont.systemFont(ofSize: 12) ], context: nil).height
146
147 self.tLayer.frame = CGRect (x: 0, y: self.frame.height*0.5 - tH*0.5, width: self.frame.width, height: tH)
148
149
150 }
151
152 }
153 //
154
155 class ProgressOneLayer: ProgressLayer {
156 ///定义画笔
157 override func draw(in ctx: CGContext) {
158
159 let radius = self.frame.width * 0.45
160 let center = CGPoint (x: self.frame.width*0.5, y: self.frame.height*0.5)
161
162 ctx.setStrokeColor(UIColor.cyan.cgColor)
163
164 ctx.setLineWidth(radius * 0.08)
165
166 ctx.setLineCap(CGLineCap.round)
167
168 let endAngle = CGFloat(self.number) * CGFloat.pi*2.0 - CGFloat.pi*0.5
169
170 //zaddaArc 画原型
171 ctx.addArc(center: center, radius: radius, startAngle: -0.5*CGFloat.pi, endAngle: endAngle, clockwise: false)
172
173 ctx.strokePath()
174
175
176 }
177
178 }
179
180 class ProgressTwoLayer: ProgressLayer {
181
182 override func draw(in ctx: CGContext) {
183
184 let radius = self.frame.width * 0.45
185 let center = CGPoint (x: self.frame.width*0.5, y: self.frame.height*0.5)
186 ctx.setFillColor(UIColor.yellow.cgColor)
187
188 //画线
189 ctx.move(to: center)
190 ctx.addLine(to: CGPoint (x: center.x, y: self.frame.height*0.5))
191
192
193 let endAngle = CGFloat (self.number) * CGFloat.pi * 2.0 - CGFloat.pi*0.5
194
195
196 ctx.addArc(center: center, radius: radius, startAngle: -0.5*CGFloat.pi, endAngle: endAngle, clockwise: false)
197
198 ctx.closePath()
199 ctx.fillPath()
200
201 }
202
203 }
204
205 class ProgressThreeLayer: ProgressLayer {
206
207 override func draw(in ctx: CGContext) {
208
209 let radius = self.frame.width * 0.45
210 let center = CGPoint (x: self.frame.width * 0.5, y: self.frame.height * 0.5)
211 ctx.setFillColor(UIColor.orange.cgColor)
212 ctx.setStrokeColor(UIColor.gray.withAlphaComponent(0.3).cgColor)
213 ctx.setLineWidth(radius*0.06)
214 ctx.addEllipse(in: CGRect(x: self.frame.width*0.05, y: self.frame.height*0.05, width: self.frame.width*0.9, height: self.frame.height*0.9))
215 ctx.strokePath()
216
217 let startAngle = CGFloat.pi * 0.5 - CGFloat(self.number) * CGFloat.pi
218
219 let endAngle = CGFloat.pi * 0.5 + CGFloat(self.number) * CGFloat.pi
220
221 ctx.addArc(center: center, radius: radius, startAngle: startAngle, endAngle:endAngle , clockwise: false)
222
223 ctx.closePath()
224 ctx.fillPath()
225
226 }
227
228 }
229
230 class ProgressFourLayer: ProgressLayer {
231 ///定义画笔
232 override func draw(in ctx: CGContext) {
233
234 let radius = self.frame.width * 0.45
235 let center = CGPoint (x: self.frame.width*0.5, y: self.frame.height*0.5)
236
237 // 背景
238 ctx.setStrokeColor(UIColor.gray.withAlphaComponent(0.8).cgColor)
239 ctx.setLineWidth(radius*0.07)
240 ctx.addEllipse(in: CGRect(x: self.frame.width*0.05, y: self.frame.height*0.05, width: self.frame.width*0.9, height: self.frame.height*0.9))
241 ctx.strokePath()
242
243
244 ctx.setStrokeColor(UIColor.red.cgColor)
245 ctx.setLineWidth(radius * 0.08)
246 ctx.setLineCap(CGLineCap.round)
247 let endAngle = CGFloat(self.number) * CGFloat.pi*2.0 - CGFloat.pi*0.5
248 //zaddaArc 画原型
249 ctx.addArc(center: center, radius: radius, startAngle: -0.5*CGFloat.pi, endAngle: endAngle, clockwise: false)
250
251 ctx.strokePath()
252
253
254 }
255
256 }
ctx.setLineDash( )// 设置虚线