我有一个自定义的 UIView 类,我用它来绘制弧线。我想要实现的是围绕这条弧线添加标签。这是我想要实现的输出
我可以画出圆弧,但我不确定如何给它添加标签。这是我用来创建弧线的代码。
自定义 UIView 类
open class Gauge: UIView {
var gaugeLayer: CALayer!
var ringLayer: CAShapeLayer!
private let uLabel = UILabel()
func updateLayerProperties() {
backgroundColor = UIColor.clear
if (ringLayer != nil) {
ringLayer.strokeEnd = 0.75
}
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateLayerProperties()
addLabel()
}
public override init(frame: CGRect) {
super.init(frame: frame)
updateLayerProperties()
addLabel()
}
open override func draw(_ rect: CGRect) {
super.draw(rect)
updateLayerProperties()
}
func resetLayers() {
layer.sublayers = nil
ringLayer = nil
}
open override func layoutSubviews() {
resetLayers()
gaugeLayer = getCircleGauge(rotateAngle)
layer.addSublayer(gaugeLayer)
updateLayerProperties()
}
func addLabel() {
uLabel.font = //font
uLabel.textColor = //color
addSubview(uLabel)
}
}
arc代码
func getCircleGauge() -> CAShapeLayer {
let gaugeLayer = CAShapeLayer()
if ringLayer == nil {
ringLayer = CAShapeLayer.getOval(lineWidth, strokeStart: 0, strokeEnd: 0.75, strokeColor: UIColor.clear, fillColor: UIColor.clear, shadowRadius: shadowRadius, shadowOpacity: shadowOpacity, shadowOffsset: CGSize.zero, bounds: bounds)
ringLayer.frame = layer.bounds
gaugeLayer.addSublayer(ringLayer)
}
gaugeLayer.frame = layer.bounds
gaugeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5)
gaugeLayer.transform = CATransform3DRotate(gaugeLayer.transform, CGFloat(rotateAngle * 2 - pi_2 * 5 / 2), 0, 0, 1)
ringLayer.lineCap = .round
return gaugeLayer
}
当我尝试在其初始化的自定义视图中添加 UILabel 时,应用程序崩溃了
view.superview is nil during traversal after it has appeared in superview subviews
我不确定是什么问题?我是添加 UILabels 还是有任何其他方法可以做到这一点。