我如何获得在iOS图表中具有相同x点的其他行的highlight.xPx和highlight.yPx?

问题描述 投票:0回答:1

我能够使用iOS-Charts在图形上绘制线条。x点是所有行的公共点,但是y点是不同的。

当我在图形上移动光标时,我希望所有其他圆圈也可以通过一次拖动来移动。

因此,当我从任意三行中选择x点中的任意一个时,我也希望另外两行中的highlight.xPxhighlight.yPx

这里是一个例子

let dysLineEntries: [ChartDataEntry] = [ChartDataEntry(x: 20.0, y: 120.0),
                                        ChartDataEntry(x: 30.0, y: 100.0),
                                        ChartDataEntry(x: 40.0, y: 130.0)]
let sysLineEntries: [ChartDataEntry] = [ChartDataEntry(x: 20.0, y: 70.0),
                                        ChartDataEntry(x: 30.0, y: 80.0),
                                        ChartDataEntry(x: 40.0, y: 90.0)]
let pulseLineEntries: [ChartDataEntry] = [ChartDataEntry(x: 20.0, y: 90.0),
                                          ChartDataEntry(x: 30.0, y: 80.0),
                                          ChartDataEntry(x: 40.0, y: 70.0)]

所以这就是我尝试使用Transformer来获取像素点的方法,但它返回的坐标与我传递给它的坐标相同。

func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
  let index = Int(entry.x)
  if transformer == nil {
      transformer = Transformer(viewPortHandler: chartView.viewPortHandler)
  }

  for (dataSetIndex, dataSet) in chartView.data!.dataSets.enumerated() {
    let item = (dataSet as! LineChartDataSet).entries[index]
    switch dataSetIndex {
    case 0: // dysLineEntries
      var point = CGPoint(x: item.xPx, y: item.yPx)
      transformer!.pointValueToPixel(&point)
    case 1: // sysLineEntries
      var point = CGPoint(x: item.x, y: item.y)
      transformer!.pointValueToPixel(&point)
    case 2: // pulseLineEntries
      var point = CGPoint(x: item.x, y: item.y)
      transformer!.pointValueToPixel(&point)
    default:
      break
    }
  }
}

我想在相同的x位置将黄色和红色圆圈与蓝色圆圈一起移动到他们所尊敬的线上。

基本上我想要像素点,因为我需要将imageView定位在所有3条线上的中心位置。

enter image description here

swift ios-charts
1个回答
0
投票

我通过创建自己的Transformer并将pointValue转换为像素找到了解决方案。

func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
  let index = Int(entry.x)
  if transformer == nil {
      transformer = Transformer(viewPortHandler: chartView.viewPortHandler)
      transformer?.prepareMatrixOffset(inverted: false)
      transformer?.prepareMatrixValuePx(chartXMin: chartView.chartXMin,
                                        deltaX: CGFloat(chartView.chartXMax-chartView.chartXMin),
                                        deltaY: CGFloat(chartView.chartYMax-chartView.chartYMin),
                                        chartYMin: chartView.chartYMin)
  }

  for (dataSetIndex, dataSet) in chartView.data!.dataSets.enumerated() {
    let item = (dataSet as! LineChartDataSet).entries[index]
    switch dataSetIndex {
    case 0: // dysLine
      var point = CGPoint(x: item.x, y: item.y)
      transformer!.pointValueToPixel(&point)
      dysImageView.center = point
    case 1: // sys
      var point = CGPoint(x: item.x, y: item.y)
      transformer!.pointValueToPixel(&point)
      sysImageView.center = point
    case 2: // pulse
      var point = CGPoint(x: item.x, y: item.y)
      transformer!.pointValueToPixel(&point)
      pulseImageView.center = point
    default:
      break
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.