Charts: (v3.0 + Swift3.0)ChartViewhighlightValueWithXが機能しない

作成日 2016年09月20日  ·  23コメント  ·  ソース: danielgindi/Charts

ChartViewのhighlightValueWithXメソッドはv3.0 + Swift3.0では機能しなくなったようです
Xcode 8 /マスターブランチ/ Objc。

bug ★★★

最も参考になるコメント

次の行を変更します:lineChartView.highlightValue(x:3、dataSetIndex:0)

to: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を最新の母校でチェックしました

折れ線グラフでまだ機能していないことをプログラムで強調表示します。

私は最後の値を強調しようとします:

[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:デリゲートメソッドが呼び出されます。このメソッドには、エントリオブジェクトに正しい値が含まれていますが、highlightオブジェクトのy値にはNaNが含まれています。

y値も含むChartHighlight *オブジェクトを作成する方法はありますか? ChartHighlightクラスにはさまざまなinitメソッドがありますが、他のすべてのメソッドには絶対ピクセル位置が必要です。

@ liuxuan30チャートのデモのどの部分がプログラムでチャートを強調しているのか指摘できますか?

または、強調表示を使用する以外に、現在選択されているエントリを他のメカニズムで表示する方法はありますか?

チャートはフォーカス環境をサポートしていないため、これはTVOSにとって絶対に不可欠であり、チャートでのユーザーインタラクションは、組み込みのジェスチャ認識機能に依存するのではなく、プログラムで処理する必要があります。

この問題を回避するために、ローカルコピーで次のことを行いました。

Highlight.swiftで、ay値も受け取る初期化子を追加します。

    /// - 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)
   )

私は、これが前進するための適切なアプローチであるかどうかを知るためのコードに完全に精通していません。 もしそうなら、私は役立つだろう1つのことはChartData.entryForHighlight()逆として機能するChartData.highlightForEntry() -> Highlightだと思います

実際、よく見ると、折れ線グラフに適用されていない他のレンダラーのいくつかに最近修正が加えられていることがわかりました。

このコミットでは:

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

x変数とy変数は、ハイライトhではなく、 entryから取得するように変更されました。 これと同じ修正がLineChartRendererに適用された場合、問題は修正されると思います。

私はそれを試してみて、うまくいけば、今日の時間の許す限り、そのためのPRを準備します。

また、ハイライト行がcontentTopからcontentBottomに移動するだけなので、y値が実際に使用されているようには見えません。 問題の根本は、実際には次の行にあることです。

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

yNaN場合、pt.xもNaNとして出力されます。 ここのSwiftReplで証明されているように、これは実際にはSwift 3 / CoreGraphicsのバグのようです。

  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)繰り返す必要はありませんが、現在はそうです。 複数のエントリがあってはならないので害はないと思いますが、それが事実であることが確認できれば、それを1回の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が呼び出された場合のみ表示されません。

それでも動作しません。

Swift3ではまだ機能していません。

`クラス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)

to:lineChartView.highlightValue(Highlight(x:3、y:0、dataSetIndex:0)

複数のデータセットを持つ折れ線グラフでay:0を指定しようとしましたが、それでも機能しません。 これに関する更新はありますか? かなり大きなバグです。

私はObjectiveCから電話をかけています。

ハイライトされた値の位置を取得するための小さなハック

// 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 Swift5.1の円グラフのセクションを強調表示できないようです

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

valeIT picture valeIT  ·  3コメント

kirti0525 picture kirti0525  ·  3コメント

Aungbandlab picture Aungbandlab  ·  4コメント

Bharati555 picture Bharati555  ·  4コメント

deepumukundan picture deepumukundan  ·  3コメント