Charts: (v3.0 + Swift3.0)ChartView highlightValueWithX无法正常工作

创建于 2016-09-20  ·  23评论  ·  资料来源: danielgindi/Charts

ChartView highlightValueWithX方法似乎不再适用于v3.0 + Swift3.0
Xcode 8 / Master分支/ 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突出显示它是非常有用的,并且根据问题判断,很多人都依赖它...因此,如果删除它,我们会收到仇恨邮件:-)

目前有什么工作可以以编程方式突出显示折线图项目吗? 目前所有高光方法都坏了吗?

@apurva折线图应该可以正常工作。 我检查了ChartsDemo和最新的Mater分支

以编程方式突出显示折线图中仍无法使用的功能。

我尝试突出显示最后一个值:

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

但是在委托方法中-(void)chartValu eSelected:entry :highlight:Highlight.xPx和

我可以再次确认highlightValueWithX无法正常工作。

我尝试创建一个亮点
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
并使用了highlightValueWithHighlight方法,但仍然没有突出显示。 chartValueSelected:entry:高亮:调用了委托方法,该方法在入口对象中包含正确的值,但是高亮对象的y值具有NaN。

有没有办法创建一个同时包含y值的ChartHighlight *对象? 我看到了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

xy变量已更改为来自entry而非突出显示h 。 我认为,如果将此相同的解决方案应用于LineChartRenderer该问题将得到解决。

我会尝试的,希望在今天允许的情况下准备好公关。

而且,它看起来好像并没有实际使用y值,因为突出显示的行只是从contentTop到contentBottom。 问题的根源实际上是此行中的内容:

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

如果yNaN那么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复制了代码,但添加了LineChartRenderer拥有的if x > chartXMax * animator.phaseX支票。

我不认为我需要遍历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中为我工作。

`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,但仍然无法正常工作。 有什么更新吗? 这是一个很大的错误。

我是从Objective 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
        }
}

我尝试了您的hack,jndefosse,但是如何调用仅在突出显示条目时才显示标签的函数?

这个错误修复了吗? 我似乎无法在iOS 13.5 Swift 5.1的Pie Chart中突出显示一个部分

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

newbiebie picture newbiebie  ·  3评论

guanyanlin picture guanyanlin  ·  3评论

PrashantKT picture PrashantKT  ·  3评论

JW00332 picture JW00332  ·  4评论

BrandonShega picture BrandonShega  ·  4评论