Добавьте текст к фигуре в центре - PullRequest
0 голосов
/ 29 мая 2020

Я создал представление, которое выглядит следующим образом:

enter image description here

Я хочу добавить текстовую метку к каждому сегменту в представлении, чтобы он выравнивается по центру. Каждый сегмент представляет собой настраиваемую кнопку, которая также реагирует, когда находится в указанном слое. Когда я пытаюсь сделать button.setTitle, поскольку рамка для кнопки отличается, она не выравнивается со слоем формы. Может ли кто-нибудь посоветовать, как добиться того же.

Я попытался создать другую функцию и вызвать ее при создании формы и кнопок.

func addText(_ stringValue: String, to shapeLayer: CAShapeLayer) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            let textlayer = CATextLayer()
            if let rect = shapeLayer.path?.boundingBox {
//                print(rect)
                textlayer.frame = CGRect(x: rect.origin.x + rect.size.width/2, y:rect.origin.y + rect.size.height/2, width: 20, height: 20)
                textlayer.fontSize = 12
                textlayer.alignmentMode = .center
                textlayer.string = stringValue
                textlayer.backgroundColor = UIColor.clear.cgColor
                textlayer.foregroundColor = UIColor.black.cgColor
                shapeLayer.addSublayer(textlayer)
            }
        }
    }

Но это не работает, поскольку текст накладывается на слой. Может ли кто-нибудь предложить способ достичь того же?

EDIT:

Каждый сегмент имеет текст, я просто добавил несколько из них, чтобы дать представление.

enter image description here

РЕДАКТИРОВАТЬ 2:

Код для создания представления:

        for segment in outerSegments { 
            let endAngle = startAngle + 2 * .pi * (segment.value / valueCount)
            let shape = CAShapeLayer()
            let path: UIBezierPath = UIBezierPath(arcCenter: viewCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
            path.addLine(to: viewCenter)
            path.close()
            shape.path = path.cgPath
            shape.fillColor = segment.color.cgColor
            shape.strokeColor = UIColor.black.cgColor
            shape.borderWidth = 1.0
            shape.borderColor = UIColor.black.cgColor
            shape.name = "\(i)"
            datamap[shape.name ?? ""] = data[i]
            let label = CATextLayer()

            //addText(data[i], to: shape)
            let b = MyButton(type: .custom)
            b.path = path
            b.backgroundColor = UIColor.clear
            b.tag = Int(data[i].asciiValues[0])
            b.backgroundColor = UIColor.clear
            self.layer.addSublayer(shape)
            let frameRect = shape.bounds
            b.frame = frameRect
            let sine = sin(startAngle)
            let cosine = cos(startAngle)
            print("\(sine)  \(data[i])")
            b.addTarget(self, action: #selector(ButtonClicked(_:)), for: .touchUpInside)
            self.addSubview(b)
            self.bringSubviewToFront(b)
            self.isUserInteractionEnabled = true
            //layer.addSublayer(shape)
            startAngle = endAngle
            i += 1
        }
        valueCount = innerSegments.reduce(0, {$0 + $1.value})
        startAngle = 0
        i = 100
        for segment in innerSegments {
            let endAngle = startAngle + 2 * .pi * (segment.value / valueCount)
            let shape = CAShapeLayer()
            let path: UIBezierPath = UIBezierPath(arcCenter: viewCenter, radius: 2*radius/3, startAngle: startAngle, endAngle: endAngle, clockwise: true)
            path.addLine(to: viewCenter)
            path.close()
            shape.path = path.cgPath
            shape.strokeColor = UIColor.black.cgColor
            shape.fillColor = segment.color.cgColor
            shape.borderWidth = 1.0
            shape.borderColor = UIColor.black.cgColor
            shape.name = "\(i)"
            datamap[shape.name ?? ""] = data[i-100]
            addText(data[i-100], to: shape)
            let b = MyButton(type: .custom)
            b.path = path
            b.backgroundColor = UIColor.clear
            self.layer.addSublayer(shape)
            let frameRect = shape.bounds
            b.frame = frameRect
            b.tag = Int(data[i-100].asciiValues[0])

            b.addTarget(self, action: #selector(ButtonClicked(_:)), for: .touchUpInside)
            self.addSubview(b)
            self.bringSubviewToFront(b)

            self.isUserInteractionEnabled = true
            //layer.addSublayer(shape)
            startAngle = endAngle
            i += 1
        }
        valueCount = innerMostSegments.reduce(0, {$0 + $1.value})
        startAngle = 0
        i = 1000
        for segment in innerMostSegments {
            let endAngle = startAngle + 2 * .pi * (segment.value / valueCount)
            let shape = CAShapeLayer()
            let path: UIBezierPath = UIBezierPath(arcCenter: viewCenter, radius: radius/3, startAngle: startAngle, endAngle: endAngle, clockwise: true)
            path.addLine(to: viewCenter)
            path.close()
            shape.path = path.cgPath
            shape.fillColor = segment.color.cgColor
            shape.strokeColor = UIColor.black.cgColor
            shape.borderWidth = 1.0
            shape.borderColor = UIColor.black.cgColor
            shape.name = "\(i)"
            datamap[shape.name ?? ""] = data[i-1000]
            addText(data[i-1000], to: shape)
            let b = MyButton(type: .custom)
            b.path = path
            b.backgroundColor = UIColor.clear
            self.layer.addSublayer(shape)
            let frameRect = shape.bounds
            b.frame = frameRect
            b.tag = Int(data[i-1000].asciiValues[0])
            b.addTarget(self, action: #selector(ButtonClicked(_:)), for: .touchUpInsid)
            self.addSubview(b)
            self.bringSubviewToFront(b)
            self.isUserInteractionEnabled = true
            startAngle = endAngle
            i += 1
        }
    }

1 Ответ

0 голосов
/ 29 мая 2020

Предположительно, вы используете математику для вычисления «спиц» и «дуг»?

Для каждого сегмента вам, вероятно, нужно разделить пополам углы, составляющие стороны (желтая линия), а затем вычислить точка (красная точка) вдоль этой линии посередине между дугами:

enter image description here

Эта точка становится центром рамки этикетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...