如何检测图表标记上的点击手势?

How to detect tap gesture on chart marker?

我正在使用 Charts 在应用程序中创建自定义图表。我遇到的一件事是检测为当前值显示的图表标记上的触摸事件。我想根据被点击的标记执行和操作。该操作应采用点击标记表示的数据条目。

我已经通读了 Selectable marker view & images at Y axis,但仍然无法提出可行的解决方案。

如果有人可以提供代码示例或比上面 link 中找到的更详细的解释来为我指明正确的方向,那就太好了。

谢谢

根据您的要求,Charts 库的委托中已包含该方法。

请检查以下代码:

  1. 如下所示将委托分配给您的 ChartView
lineChartView.delegate = self
  1. 在您的 class
  2. 中实施委托方法
public func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {

}

您可以在用户点击图表的同时编写代码。

希望此信息对您有所帮助!

我最终通过子类化我选择的 ChartView 并用我自己的点击手势识别器覆盖现有的点击手势识别器来解决这个问题。

例子

final class CustomChartView: BarChartView {
    ...
    private func initialize() {
        ...
        let tap = UITapGestureRecognizer(target: self, action: #selector(tapRecognized))
        self.addGestureRecognizer(tap)
    }

    @objc func tapRecognized(_ recognizer: UITapGestureRecognizer) {
        guard data !== nil else { return }

        switch recognizer.state {
            case .ended:
            // Detect whether or not the touch was inside a marker that was being presented
            // Otherwise, add/remove highlight as necessary

            if let marker = self.marker as? BalloonMarker {
                let location = recognizer.location(in: self)

                if !highlighted.isEmpty && marker.rect.contains(location) {
                    // In my case, I created custom property 'vertex' on BalloonMarker for easy reference to get `xValue`
                    let xValue = self.getTransformer(forAxis: .left).valueForTouchPoint(marker.vertex).x

                    // Do what you need to here with tap (call function, create custom delegate and trigger it, etc)
                    // In my case, my chart has a marker tap delegate
                    // ex, something like: `markerTapDelegate?.tappedMarker()`

                    return
                }
            }

            // Default tap handling
            guard isHighLightPerTapEnabled else { return }

            let h = getHighlightByTouchPoint(recognizer.location(in: self))

            if h === nil || h == self.lastHighlighted {
                lastHighlighted = nil
                highlightValue(nil, callDelegate: true)

            } else {
                lastHighlighted = h
                highlightValue(h, callDelegate: true)
            }

        default:
            break
    }
}