Как я могу получить `highlight.xPx` &` highlight.yPx` других линий, которые имеют ту же точку x в iOS -Chart? - PullRequest
0 голосов
/ 05 марта 2020

Мне удалось добиться построения линий на графике, используя iOS -Charts . Точки x являются общими для всех линий, но точки y различны.

Когда я перемещаю курсор по графику, я хочу, чтобы все остальные круги также перемещались одним перетаскиванием.

Поэтому, когда я выбираю любую из точек x среди любых 3 строк, я хочу highlight.xPx & highlight.yPx других 2 строк.

Вот пример

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

1 Ответ

2 голосов
/ 06 марта 2020

Я нашел решение, создав собственное 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
    }
  }
}
...