HorizontalBarChart 值突出显示
HorizontalBarChart Value Highlighting
我目前正在使用 Charts cocoapod
,但我不知道如何实现以下功能:从 HorizontalBarChartDatSet
选择 DataEntry
时,我想通过更改来突出显示它栏的borderColor
。这对于当前版本的 pod 是否可行?如果不行,您能否至少给我一些关于在哪里查看以覆盖此功能的信息?
目前我可以像这样突出显示 DataEntry
:
dataSet.highlightColor = UIColor.lightGray
dataSet.highlightAlpha = 1
但是,我只想在选定的周围制作边框 DataEntry
而不是更改其颜色。
我已经为一些特定功能覆盖了库,但似乎无法弄清楚这一点。
提前致谢!
据我所知,当前版本的图表库没有选定栏周围的突出显示边框的属性。但是您可以从 BarChartRenderer
class 继承您自己的 class,覆盖函数 drawHighlighted(context: indices:)
并使用新渲染器 class 的实例作为图表的自定义渲染器。
自定义渲染器 class:
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)
结果:
我目前正在使用 Charts cocoapod
,但我不知道如何实现以下功能:从 HorizontalBarChartDatSet
选择 DataEntry
时,我想通过更改来突出显示它栏的borderColor
。这对于当前版本的 pod 是否可行?如果不行,您能否至少给我一些关于在哪里查看以覆盖此功能的信息?
目前我可以像这样突出显示 DataEntry
:
dataSet.highlightColor = UIColor.lightGray
dataSet.highlightAlpha = 1
但是,我只想在选定的周围制作边框 DataEntry
而不是更改其颜色。
我已经为一些特定功能覆盖了库,但似乎无法弄清楚这一点。
提前致谢!
据我所知,当前版本的图表库没有选定栏周围的突出显示边框的属性。但是您可以从 BarChartRenderer
class 继承您自己的 class,覆盖函数 drawHighlighted(context: indices:)
并使用新渲染器 class 的实例作为图表的自定义渲染器。
自定义渲染器 class:
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)
结果: