Shinobi iOS : 饼图用价值和名字说话

Shinobi iOS : Pie chart spoke with value and name

我想创建带有一点自定义辐条的饼图。

我想要实现的是在辐条上方显示名称 od 数据点,在辐条下方显示值。现在我知道如何使用

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

并将标签行数设置为 2....

如何在下面和上面放置一个标签?

马克

我已经在我们的 shinobicontrols forum 上回答了你的问题,但我把我的回答贴在这里以防有人遇到这个问题 post:

如果您不使用辐条,那么执行此操作的方法是使用委托方法 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);
            }
        }
    }
}

请注意,正如所解释的那样 here UIKit 并未正式与 KVO 兼容,但大多数用户 post 同意此处建议的代码确实有效。 (您可能希望添加比我在这里添加的更多的观察者。)

对于相当长的解决方法,我深表歉意,但我希望它对您有所帮助。