我想创建一个带有一点定制辐条的饼图。
我想要实现的是在辐条上方显示名称od数据点,在辐条下方显示值。现在我知道如何使用
进行上述操作x1 = c(0, 1, 0, 1, 0)
x2 = c(1, 2, 3, 4, 5)
x3 = c(2, 3, 4, 5, 6)
如何在下面放一个标签,在上面放一个?
标记
答案 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标准,但该帖子上的大多数用户都同意建议的代码确实有效。 (您可能希望添加更多观察员,而不是我在这里添加的。)
我为相当长的解决方法道歉,但我希望它可以帮助你。