iOS Charts(Daniel Gindi):长按手势无法触发chartValueSelected求解决
解决Charts框架长按手势不触发chartValueSelected的问题
Charts框架中,chartValueSelected(_:entry:highlight:)方法默认仅响应轻击(UITapGestureRecognizer)和拖拽(UIPanGestureRecognizer)手势,长按手势(UILongPressGestureRecognizer)有独立的处理逻辑,不会触发该方法,你可以通过以下步骤解决:
确认长按手势已启用
先确保你的LineChartView开启了长按交互(默认是开启的,保险起见可手动设置):lineChart.isLongPressEnabled = true实现长按专属的代理方法
ChartViewDelegate提供了chartLongPressed(_:entry:highlight:)方法,专门用于处理长按事件,把你在chartValueSelected中的逻辑迁移或复制到这个方法里即可:extension GraphTableViewCell: ChartViewDelegate { func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) { marker.color = ColorName.reddishPink lineChart.data = viewModel.updateGraph(with: Int(entry.x)) } func chartLongPressed(_ chartView: ChartViewBase, entry: ChartDataEntry?, highlight: Highlight) { guard let targetEntry = entry else { return } // 复用原有逻辑 marker.color = ColorName.reddishPink lineChart.data = viewModel.updateGraph(with: Int(targetEntry.x)) } }优化代码复用(可选)
如果长按和轻击/拖拽需要执行完全相同的逻辑,可把公共逻辑抽成私有方法,在两个代理方法中调用,避免代码重复:private func handleChartEntrySelection(_ entry: ChartDataEntry) { marker.color = ColorName.reddishPink lineChart.data = viewModel.updateGraph(with: Int(entry.x)) } // 在代理方法中调用公共逻辑 func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) { handleChartEntrySelection(entry) } func chartLongPressed(_ chartView: ChartViewBase, entry: ChartDataEntry?, highlight: Highlight) { guard let entry = entry else { return } handleChartEntrySelection(entry) }
内容的提问来源于stack exchange,提问作者ironRoei
相关产品推荐
相关产品推荐

