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 同意此处建议的代码确实有效。 (您可能希望添加比我在这里添加的更多的观察者。)
对于相当长的解决方法,我深表歉意,但我希望它对您有所帮助。
我想创建带有一点自定义辐条的饼图。
我想要实现的是在辐条上方显示名称 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 同意此处建议的代码确实有效。 (您可能希望添加比我在这里添加的更多的观察者。)
对于相当长的解决方法,我深表歉意,但我希望它对您有所帮助。