Shinobi iOS: круговая диаграмма со значением и именем

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

Чего я хотел бы добиться, так это отобразить имя od datapoint выше луча и значение ниже луча. Прямо сейчас я знаю, как сделать это оба выше с

func sChart(_ chart: ShinobiChart, labelForSliceAt sliceIndex: Int, in series: SChartRadialSeries) -> UILabel?

и установите номер метки в строке на 2....

Как поставить один ярлык ниже, а другой выше?

отметка

1 ответ

Решение

Я ответил на ваш вопрос на нашем форуме shinobicontrols, но вставляю свой ответ здесь на случай, если кто-нибудь натолкнется на это сообщение:

Если вы не используете спицы, то способ сделать это будет использовать метод делегата sChart:alterLabel:forDatapoint:atSliceIndex:inRadialSeries: переместить метку, но, к сожалению, в настоящее время существует проблема, которая означает, что при отображении спиц этот метод вызывается перед позиционированием меток.

Мы постараемся исправить проблему в будущем выпуске shinobicharts, но пока вы можете обойти эту проблему, создав собственные метки и используя KVO, например:

func sChart(_ chart: ShinobiChart, labelForSliceAt sliceIndex: Int, in series: SChartRadialSeries) -> UILabel {
    let pieSeries = series as! SChartPieSeries
    let dp = self.sChart(chart, dataPointAt: sliceIndex, forSeriesAt: 0)
    let label = UILabel()
    label.text = String(format:"Slice %i", sliceIndex)
    label.sizeToFit()
    label.addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
    label.addObserver(self, forKeyPath: "center", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
    label.layer.addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
    label.layer.addObserver(self, forKeyPath: "center", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)

    sliceLabels[sliceIndex] = label

    let customLabel = UILabel()
    customLabel.text = String(format:"Value: %.0f", dp.sChartYValue() as! Float)
    customLabel.font = pieSeries.style().labelFont
    customLabel.textColor = pieSeries.style().labelFontColor
    customLabel.backgroundColor = pieSeries.style().labelBackgroundColor
    customLabel.sizeToFit()
    chart.canvas.overlay.addSubview(customLabel);
    customLabels[sliceIndex] = customLabel;

    return label;
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let changedLabel = object as? UILabel {
        for (index, label) in sliceLabels {
            if let sliceLabel = label as? UILabel, sliceLabel === changedLabel {
                let customLabel = customLabels[index] as! UILabel
                customLabel.center = CGPoint(x: sliceLabel.center.x,
                                             y: sliceLabel.center.y + sliceLabel.frame.size.height);
            }
        }
    }
}

Обратите внимание, что, как объясняется здесь, UIKit не является официально совместимым с KVO, но большинство пользователей этого поста согласны с тем, что предложенный там код работает. (Вы можете добавить больше наблюдателей, чем я добавил здесь.)

Я прошу прощения за довольно долгий обходной путь, но я надеюсь, что это поможет вам.

Другие вопросы по тегам