如何使用 CAShapeLayer 在自定义视图中添加标签

问题描述 投票:0回答:0

我有一个自定义的 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 还是有任何其他方法可以做到这一点。

ios swift uiview cashapelayer
© www.soinside.com 2019 - 2024. All rights reserved.