IOS自定义进度条和CAShapeLayer
我如何创建一个自定义弓像这张图片与文字的结束弧 这是我的当前代码和当前结果IOS自定义进度条和CAShapeLayer,ios,swift,view,progress,Ios,Swift,View,Progress,我如何创建一个自定义弓像这张图片与文字的结束弧 这是我的当前代码和当前结果 let center = view.center let circularPath = UIBezierPath(arcCenter: center, radius: 120, startAngle: CGFloat.pi , endAngle: CGFloat.pi*2, clockwise: true) let greyLayer = CASha
let center = view.center
let circularPath = UIBezierPath(arcCenter: center, radius: 120, startAngle: CGFloat.pi , endAngle: CGFloat.pi*2, clockwise: true)
let greyLayer = CAShapeLayer()
greyLayer.strokeColor = greyColor
greyLayer.lineWidth = lineWidth
greyLayer.path = circularPath.cgPath
greyLayer.lineCap = .round
greyLayer.fillColor = UIColor.clear.cgColor
greyLayer.shadowColor = UIColor.black.cgColor
greyLayer.shadowOpacity = 1
greyLayer.shadowOffset = .zero
greyLayer.shadowRadius = 2
view.layer.addSublayer(greyLayer)
shapeLayer.strokeColor = bowColor
shapeLayer.lineWidth = lineWidth
shapeLayer.path = circularPath.cgPath
shapeLayer.lineCap = .round
shapeLayer.strokeEnd = 0
shapeLayer.fillColor = UIColor.clear.cgColor
view.layer.addSublayer(shapeLayer)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
let label = UILabel()
label.text = "Best"
label.textAlignment = .center
label.textColor = .red
label.font = UIFont.boldSystemFont(ofSize: 30)
view.addSubview(label)
view.layer.addSublayer(label.layer)
label.translatesAutoresizingMaskIntoConstraints = false
label.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
label.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
label.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
label.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
当前结果
我想在弧的末端添加一个圆形,并像上图那样设置动画,
我不知道如何实现这一点
要开始
您的弧从.pi
到.pi*2
。。。但它可能会帮助您将其视为:
- 电弧从
开始,即“9点钟”.pi
- 完整的进度将跨越到“3点钟”,即将
添加到起始角度.pi
.pi
加上.pi*进度百分比
因此,要获得端角
:
- 25%的进度将是
.pi+((25.0/100.0)*.pi)
- 50%的进度将是
.pi+((50.0/100.0)*.pi)
- 83%的进度将是
.pi+((83.0/100.0)*.pi)
let score = 83
let endAngle: CGFloat = .pi + ((CGFloat(score) / 100.0) * .pi)
let center = view.center
let circularPath = UIBezierPath(arcCenter: center, radius: 120, startAngle: .pi, endAngle: endAngle, clockwise: true)
现在你的弧跨越了“半圆”的83%
要在弧的末端添加标签,可以从路径获取该点:
// point at end of arc
let endPoint: CGPoint = circularPath.currentPoint
您可以使用该点定位标签(或自定义“引出序号”标签视图)
这是您的代码,稍加修改以添加分数
值和进度标签
:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemTeal
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let greyColor = UIColor.gray.cgColor
let bowColor = UIColor.systemPink.cgColor
let lineWidth: CGFloat = 12
let shapeLayer = CAShapeLayer()
let score = 83
let endAngle: CGFloat = .pi + (.pi * (CGFloat(score) / 100.0))
let center = view.center
let circularPath = UIBezierPath(arcCenter: center, radius: 120, startAngle: .pi, endAngle: endAngle, clockwise: true)
// point at end of arc
let endPoint: CGPoint = circularPath.currentPoint
let greyLayer = CAShapeLayer()
greyLayer.strokeColor = greyColor
greyLayer.lineWidth = lineWidth
greyLayer.path = circularPath.cgPath
greyLayer.lineCap = .round
greyLayer.fillColor = UIColor.clear.cgColor
greyLayer.shadowColor = UIColor.black.cgColor
greyLayer.shadowOpacity = 1
greyLayer.shadowOffset = .zero
greyLayer.shadowRadius = 2
view.layer.addSublayer(greyLayer)
shapeLayer.strokeColor = bowColor
shapeLayer.lineWidth = lineWidth
shapeLayer.path = circularPath.cgPath
shapeLayer.lineCap = .round
shapeLayer.strokeEnd = 0
shapeLayer.fillColor = UIColor.clear.cgColor
view.layer.addSublayer(shapeLayer)
//view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
let label = UILabel()
label.text = "Best"
label.textAlignment = .center
label.textColor = .red
label.font = UIFont.boldSystemFont(ofSize: 30)
view.addSubview(label)
view.layer.addSublayer(label.layer)
label.translatesAutoresizingMaskIntoConstraints = false
label.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
label.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
label.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
label.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
let progressLabel = UILabel()
progressLabel.backgroundColor = .cyan
progressLabel.text = "\(score)%"
progressLabel.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(progressLabel)
progressLabel.bottomAnchor.constraint(equalTo: view.topAnchor, constant: endPoint.y).isActive = true
progressLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: endPoint.x).isActive = true
}
}
结果是:
如果你想“动画”的进展弧和标签,这将需要一些更多的工作。。。但这是一个很好的练习,可以让你学会承担责任