Метод ChartView highlightValueWithX, похоже, перестает работать для v3.0 + Swift3.0
Xcode 8 / Главная ветка / Objc.
@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.
Самый полезный комментарий
Измените эту строку: lineChartView.highlightValue (x: 3, dataSetIndex: 0)
кому: lineChartView.highlightValue (Highlight (x: 3, y: 0, dataSetIndex: 0)