Charts: (v3.0 + Swift3.0) ChartView highlightValueWithX не работает

Созданный на 20 сент. 2016  ·  23Комментарии  ·  Источник: danielgindi/Charts

Метод ChartView highlightValueWithX, похоже, перестает работать для v3.0 + Swift3.0
Xcode 8 / Главная ветка / Objc.

bug ★★★

Самый полезный комментарий

Измените эту строку: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

кому: lineChartView.highlightValue (Highlight (x: 3, y: 0, dataSetIndex: 0)

Все 23 Комментарий

@PhilJay highlightValue(x...) функции не работают, потому что средство визуализации выделения ожидает присутствия значения Y. Результатом является NaN, из-за чего он нигде не отображается ...

И Android, и iOS?

Ага...

Хммм ... только что просмотрел код, он хитрый. В случае, если у нас есть несколько записей на одной и той же x-позиции, невозможно будет успешно выделить определенную запись без какой-либо спецификации y-позиции.

Так может, нам стоит отказаться от этого метода?
Другой вариант - включить в метод y-позицию (как параметр)?

Проблема начинается с выбора из событий касания - он все равно не работает, если у вас есть точечные или пузырьковые диаграммы с несколькими значениями на одном и том же x. Фактически он выбирает первый или последний на том же x - в зависимости от положения касания на оси X!

После того, как мы это исправим - я думаю, наш алгоритм будет знать, что нужно принимать значение Y, и после достижения правильного X он начнет поиск правильного Y.
И тогда у нас будет возможность передать значение Y отдельным методом! :-)
Исходный вариант, который можно выделить просто X, очень полезен, и многие люди зависят от него, судя по проблемам ... Так что мы получим письмо ненависти, если удалим его :-)

Есть ли какие-либо способы программного выделения элемента линейной диаграммы в настоящее время? Все ли методы выделения на данный момент не работают?

Линейный график

Программное выделение, которое все еще не работает на линейных диаграммах.

Стараюсь выделить последнее значение:

[self.lineChartView highlightValueWithX:self.lineChartView.chartXMax dataSetIndex:0 callDelegate:YES];

Но в методе делегата - (void) chartValu eSelected: entry : highlight: highlight.xPx и highlight.yPx - NaN.

Я могу еще раз подтвердить, что highlightValueWithX не работает.

Я пробовал создать блик
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
и использовал с ним метод highlightValueWithHighlight, но по-прежнему не выделяет. Вызывается метод chartValueSelected: entry: highlight: delegate, который содержит правильные значения в объекте ввода, но объект выделения имеет NaN в значении y.

Есть ли способ создать объект ChartHighlight *, содержащий также значение y? Я вижу различные методы инициализации для класса ChartHighlight, но всем остальным нужны абсолютные позиции пикселей.

@ liuxuan30 Можете ли вы указать, какая часть демонстрации диаграмм выделяет диаграмму программно?

В качестве альтернативы, есть ли способ показать текущую выбранную запись в любом другом механизме, кроме использования выделения?

Это абсолютно необходимо для TVOS, поскольку Charts не поддерживает среду фокуса, а взаимодействие пользователя с графиком должно обрабатываться программно, а не полагаться на встроенные средства распознавания жестов.

Чтобы обойти эту проблему, я сделал следующее в своей локальной копии:

В Highlight.swift добавьте инициализатор, который также принимает значение y:

    /// - parameter x: the x-value of the highlighted value
    /// - parameter y: the y-value of the highlighted value
    /// - parameter dataSetIndex: the index of the DataSet the highlighted value belongs to
    public init(x: Double, y: Double, dataSetIndex: Int)
    {
        _x = x
        _y = y
        _dataSetIndex = dataSetIndex
    }

Затем, когда я хочу программно выделить, я делаю это так:

   let entry = //... the ChartDataEntry I want to highlight
   self.chart.highlightValue(
       Highlight(x: entry.x, y: entry.y, dataSetIndex: 0)
   )

Я определенно недостаточно знаком с кодом, чтобы знать, достойный ли это подход для продвижения вперед или нет. Если это так, я думаю, что одна вещь, которая могла бы помочь, - это ChartData.highlightForEntry() -> Highlight действующий как обратный ChartData.entryForHighlight()

На самом деле, присмотревшись, я обнаружил, что в некоторых других модулях рендеринга были недавние исправления, которые не применялись к линейным диаграммам.

В этом коммите:

https://github.com/danielgindi/Charts/commit/8905a46c8262998ccdb780bbd5d2c03e45b8ab5a#diff -52d760df99fc778bb8222bd3cc9ce413R225

Переменные x и y были заменены на переменные entry , а не на Highlight h . Я думаю, если бы это же исправление было применено к LineChartRenderer проблема была бы исправлена.

Я попробую это и, надеюсь, получу PR для этого сегодня, если позволит время.

Кроме того, не похоже, что значение y действительно используется, поскольку линия выделения просто переходит от contentTop к contentBottom. Корень проблемы на самом деле в том, что в этой строке:

let pt = trans.pixelForValues(x: x, y: y)

Если y равно NaN тогда pt.x также выводится как NaN . На самом деле это похоже на ошибку Swift 3 / CoreGraphics, о чем свидетельствует Swift Repl здесь:

  7> import CoreGraphics
  8> let trans = CGAffineTransform(scaleX: 1.0, y: 1.0)
trans: CGAffineTransform = {
  a = 1
  b = 0
  c = 0
  d = 1
  tx = 0
  ty = 0
}
  9> let pt = CGPoint(x: 1.0, y: Double.nan)
pt: CGPoint = (x = 1, y = NaN)
 10> pt.applying(trans)
$R2: CGPoint = (x = NaN, y = NaN)

@apurva, можешь попробовать мою fix-1495 здесь:

https://github.com/ryanschneider/Charts/tree/fix-1495

И посмотрите, работает ли это у вас так, как ожидалось? У меня это работает. @danielgindi & @ liuxuan30 , я более или менее скопировал код из ScatterChartRenderer но добавил проверку if x > chartXMax * animator.phaseX которая была у LineChartRenderer .

Я не _think_, мне нужно повторять set.entriesForXValue(high.x) но в настоящее время я это делаю. Я не думаю, что в этом есть вред, поскольку никогда не должно быть более одной записи, но если вы можете подтвердить, что это так, я с радостью сверну это до одного вызова set.entryForXValue(high.x) и отправлю PR.

Также было бы неплохо добавить программную опцию выделения в ChartsDemo, чтобы помочь в регрессионном тестировании выделить ошибки, но я не исследовал, что для этого нужно.

Спасибо за ваши усилия @ryanschneider ! @danielgindi, что ты думаешь?

@ryanschneider Спасибо за ваши усилия. Я попробовал внести изменения в вашу ветку, но оба метода highlightValueWithX и highlightValueWithHighlight по-прежнему у меня не работают. Значение y выделения по-прежнему равно NaN, и выделение не отображается на диаграмме при программном вызове.

@danielgindi Только что протестировано с последним мастером, включая ваш коммит на https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

highlightValueWithX по-прежнему не показывает линии выделения. Делегат увольняется, а значение y выделения по-прежнему равно NaN в делегате. Как и в предыдущем случае, выделение с помощью распознавателей жестов показывает линии выделения, но не при вызове highlightValueWithX.

Все равно не работает.

У меня все еще не работает в Swift 3.

`class ChartsViewController: UIViewController {

<strong i="7">@IBOutlet</strong> var lineChartView: LineChartView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]

    setChart(dataPoints: months, values: unitsSold)

}

func setChart(dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
    let lineChartData = LineChartData(dataSet: lineChartDataSet)
    lineChartDataSet.highlightLineWidth = 2
    lineChartDataSet.highlightColor = UIColor.red

    lineChartView.data = lineChartData

    lineChartView.highlightValue(x: 3, dataSetIndex: 0)

    }

} `

Измените эту строку: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

кому: lineChartView.highlightValue (Highlight (x: 3, y: 0, dataSetIndex: 0)

Я попытался указать ay: 0 на линейном графике с несколькими наборами данных, но он все еще не работает. Есть какие-нибудь обновления по этому поводу? Это довольно большая ошибка.

Я звоню из Объекта C.

Небольшой прием, чтобы получить позицию выделенного значения

// Highlight set programmatically
let dataEntry = dataEntries[linechartData.entryCount-1]
self.lineChartView.highlightValue(Highlight(x:` dataEntry.x, y:dataEntry.y, dataSetIndex: 0), callDelegate:` true)
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        var markerPosition = CGPoint(x:highlight.xPx, y: highlight.yPx)
        // Hack to get the real position of the highlight programaticaly
        if markerPosition.x.isNaN || markerPosition.y.isNaN{
            let transformer = lineChartView.getTransformer(forAxis: lineChartView.leftAxis.axisDependency)
            let pt = transformer.pixelForValues(x: entry.x, y: entry.y)
            markerPosition.x = pt.x
            markerPosition.y = pt.y
        }
}

Я пробовал ваш взлом, jndefosse, но как я могу вызвать функцию, чтобы отображать метки только тогда, когда запись выделена?

Эта ошибка исправлена? Кажется, я не могу выделить раздел в круговой диаграмме iOS 13.5 Swift 5.1.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

cilasgimenez picture cilasgimenez  ·  4Комментарии

sjdevlin picture sjdevlin  ·  3Комментарии

heumn picture heumn  ·  3Комментарии

Aungbandlab picture Aungbandlab  ·  4Комментарии

Bharati555 picture Bharati555  ·  4Комментарии