iOS 图表:确定突出显示条目的位置和颜色

iOS Charts: Determine the positioning and color of the highlighted entry

我有一个用 Charts library 实现的饼图。现在,当一个条目被点击并突出显示时,我想显示一个工具提示,显示所选条目的值,位于条目的中间,并以与所选饼图相同的颜色勾勒出轮廓。

在委托函数chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight)中我可以获得高亮的xPxyPx,但这是用户点击高亮该条目的触摸点,而不是中心点条目本身,因此将工具提示集中在这些值上会导致工具提示根据您点击条目的位置来回跳转。而且我看不到任何方法来获取突出显示条目的颜色。

我正在尝试获取以下内容,并用粉红色勾勒出它的轮廓:

:: 1 :: 弹出窗口的位置

嗯...我一直在寻找,但我认为 ChartDataEntry 没有可用的 frame 用作设置弹出窗口位置的参考点。

不过,我认为根据点击位置进行操作是一个不错的选择。这至少让弹出窗口显示在与饼图部分相同的一般区域中。在我看来,它应该仍然是一个很好的用户体验。 :)

:: 2 :: 当前选中段的颜色

PieChartDataSet 有一个 values 属性,其中包含您的 ChartDataEntry 对象。所以你可以找到匹配的索引,因为 chartValueSelected 委托方法传递给你当前的 ChartDataEntry 对象 (entry).

PieChartView 具有 marker 属性,您可以在单击图表上的值时将其用作显示标记。在我看来,使用 marker 属性 并创建自定义标记 class 是解决任务的首选方法。

自定义标记 class 必须符合 IMarker 协议并且可以从 MarkerImage class 实例化。注意两个函数:

  • draw(context: CGContext, point: CGPoint) 函数带有两个输入参数,用于传递绘图的位置和上下文。所以你有关于你的气球位置的信息。

  • refreshContent(entry: ChartDataEntry, highlight: Highlight)。在此功能中,您可以为气球选择颜色。 MarkerImage class 有 chartView 属性 所以你可以访问数据集。如果您使用多个数据集,您可以使用 highlight.dataSetIndex 的值来定义被点击的数据集。选择数据集后,您可以使用 dataSet.entryIndex(entry: entry) 获得的索引从 dataSet.colors 属性 获得颜色。

颜色选择示例:

open override func refreshContent(entry: ChartDataEntry, highlight: Highlight)
{
    let dataSet = chartView!.data!.dataSets[highlight.dataSetIndex]
    let colorIndex = dataSet.entryIndex(entry: entry) % dataSet.colors.count
    color = dataSet.colors[colorIndex]

    super.refreshContent(entry: entry, highlight: highlight)
}