Shinobi iOS:饼图讲述了价值和名称

时间:2017-06-19 06:07:15

标签: ios xcode pie-chart shinobi

我想创建一个带有一点定制辐条的饼图。

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

进行上述操作
x1 = c(0, 1, 0, 1, 0)    
x2 = c(1, 2, 3, 4, 5)    
x3 = c(2, 3, 4, 5, 6)

并将行的标签号设置为2 .... enter image description here

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

标记

1 个答案:

答案 0 :(得分:1)

我已经在shinobicontrols forum处回答了您的问题,但是如果有人遇到这个帖子,我会在这里粘贴我的答案:

如果您没有使用辐条,那么执行此操作的方法是使用委托方法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标准,但该帖子上的大多数用户都同意建议的代码确实有效。 (您可能希望添加更多观察员,而不是我在这里添加的。)

我为相当长的解决方法道歉,但我希望它可以帮助你。