我目前正在使用Charts cocoapod
而我无法弄清楚如何实现以下功能:从DataEntry
选择HorizontalBarChartDatSet
时,我想通过更改{来突出显示它酒吧的{1}}。这是否可以使用当前版本的pod,如果没有,您能否至少给我一些关于在哪里查看以覆盖此功能的信息?
目前,我可以像这样突出显示borderColor
:
DataEntry
但是,我想只围绕选定的dataSet.highlightColor = UIColor.lightGray
dataSet.highlightAlpha = 1
制作边框而不改变其颜色。
我已经覆盖了几个特定功能的库,但似乎无法弄清楚这个。
提前谢谢!
答案 0 :(得分:2)
据我所知,图表库的当前版本没有用于选定栏周围的高亮边框的属性。但您可以从BarChartRenderer
类继承自己的类,覆盖函数drawHighlighted(context: indices:)
并使用新渲染器类的实例作为图表的自定义渲染器。
自定义渲染器类:
class MyBarChartRenderer: BarChartRenderer {
// New properties for the border
var highlightBorderColor: UIColor = .red
var highlightBorderWidth: CGFloat = 2
open override func drawHighlighted(context: CGContext, indices: [Highlight])
{
guard
let dataProvider = dataProvider,
let barData = dataProvider.barData
else { return }
context.saveGState()
var barRect = CGRect()
for high in indices
{
guard
let set = barData.getDataSetByIndex(high.dataSetIndex) as? IBarChartDataSet,
set.isHighlightEnabled
else { continue }
if let e = set.entryForXValue(high.x, closestToY: high.y) as? BarChartDataEntry
{
let trans = dataProvider.getTransformer(forAxis: set.axisDependency)
// Setting color and width for the border
context.setStrokeColor(highlightBorderColor.cgColor)
context.setLineWidth(highlightBorderWidth)
let isStack = high.stackIndex >= 0 && e.isStacked
let y1: Double
let y2: Double
if isStack
{
if dataProvider.isHighlightFullBarEnabled
{
y1 = e.positiveSum
y2 = -e.negativeSum
}
else
{
let range = e.ranges?[high.stackIndex]
y1 = range?.from ?? 0.0
y2 = range?.to ?? 0.0
}
}
else
{
y1 = e.y
y2 = 0.0
}
prepareBarHighlight(x: e.x, y1: y1, y2: y2, barWidthHalf: barData.barWidth / 2.0, trans: trans, rect: &barRect)
// Drawing the border
context.stroke(barRect)
}
}
context.restoreGState()
}
}
使用新渲染器:
myBarChartView.renderer = MyBarChartRenderer(
dataProvider: self.barChartView,
animator: self.barChartView.chartAnimator,
viewPortHandler: self.barChartView.viewPortHandler)
结果: