Charts: (v3.0 + Swift3.0) ChartView highlightValueWithX tidak berfungsi

Dibuat pada 20 Sep 2016  ·  23Komentar  ·  Sumber: danielgindi/Charts

Metode ChartView highlightValueWithX tampaknya berhenti berfungsi untuk v3.0 + Swift3.0
Xcode 8 / Cabang master / Objc.

bug ★★★

Komentar yang paling membantu

Ubah baris ini: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

to: lineChartView.highlightValue (Sorotan (x: 3, y: 0, dataSetIndex: 0)

Semua 23 komentar

@PhilJay highlightValue(x...) fungsi gagal, karena penyaji sorotan mengharapkan nilai Y ada. Hasilnya adalah NaN, yang menyebabkannya tidak menghasilkan apa-apa ...

Baik Android dan iOS?

Ya...

Hmmm ... baru saja melihat-lihat kodenya, ini yang rumit. Untuk kasus di mana kita memiliki beberapa entri pada posisi x yang sama, tidak mungkin berhasil menyorot entri tertentu tanpa spesifikasi posisi y apa pun.

Jadi mungkin kita harus menghentikan metode ini?
Pilihan lain adalah memasukkan posisi-y dalam metode (sebagai parameter)?

Masalahnya dimulai dengan pemilihan dari peristiwa sentuh - ini masih tidak benar-benar berfungsi, jika Anda memiliki bagan sebar atau gelembung dengan beberapa nilai pada x yang sama. Ini sebenarnya memilih yang pertama atau terakhir pada x yang sama - tergantung pada posisi sentuhan pada sumbu X!

Setelah kita memperbaikinya - saya kira algoritma akan tahu untuk mengambil nilai Y dan setelah mencapai X yang benar itu akan mulai mencari Y yang benar.
Dan kemudian kita akan memiliki opsi untuk meneruskan nilai Y, sebagai metode terpisah! :-)
Yang asli, untuk menyorot hanya dengan X sangat berguna dan banyak orang bergantung padanya, dilihat dari masalahnya ... Jadi kita akan mendapatkan surat kebencian jika kita menghapusnya :-)

Apakah saat ini ada solusi untuk menyorot item diagram garis secara terprogram? Apakah semua metode sorotan saat ini rusak?

Grafik garis

Sorotan secara terprogram masih tidak berfungsi di diagram garis.

Saya mencoba menyoroti nilai terakhir:

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

Tetapi dalam metode delegasi - (void) chartValu eSelected: entry : highlight: highlight.xPx dan highlight.yPx adalah NaN.

Saya dapat mengonfirmasi ulang bahwa highlightValueWithX tidak berfungsi.

Saya mencoba membuat sorotan
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
dan menggunakan metode highlightValueWithHighlight dengannya tetapi tetap tidak menyorot. Metode chartValueSelected: entry: highlight: delegate dipanggil, yang berisi nilai yang benar dalam objek entri tetapi objek sorotan memiliki NaN dalam nilai y.

Apakah ada cara untuk membuat objek ChartHighlight * yang berisi nilai y juga? Saya melihat berbagai metode init untuk kelas ChartHighlight tetapi yang lainnya membutuhkan posisi piksel absolut.

@ liuxuan30 Dapatkah Anda menunjukkan bagian mana dari demo grafik yang menyoroti grafik secara terprogram?

Atau, adakah cara untuk menampilkan entri yang saat ini dipilih dalam mekanisme lain selain menggunakan penyorotan?

Ini mutlak penting untuk TVOS karena Bagan tidak mendukung lingkungan fokus, dan interaksi pengguna pada bagan perlu ditangani secara terprogram daripada mengandalkan pengenal isyarat bawaan.

Untuk mengatasi masalah ini, saya telah melakukan hal berikut di salinan lokal saya:

Di Highlight.swift, tambahkan penginisialisasi yang juga mengambil nilai:

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

Kemudian ketika saya ingin menyorot secara terprogram, saya melakukannya seperti ini:

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

Saya pasti tidak cukup akrab dengan kode untuk mengetahui apakah ini pendekatan yang layak untuk maju atau tidak. Jika ya, saya pikir satu hal yang akan membantu adalah ChartData.highlightForEntry() -> Highlight untuk bertindak sebagai kebalikan dari ChartData.entryForHighlight()

Sebenarnya, melihat lebih dekat, saya menemukan bahwa ada perbaikan baru-baru ini untuk beberapa penyaji lain yang tidak diterapkan ke bagan Garis.

Dalam komit ini:

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

Variabel x dan y diubah menjadi dari entry , bukan Sorotan h . Saya pikir jika perbaikan yang sama ini diterapkan pada LineChartRenderer masalah akan diperbaiki.

Saya akan mencobanya dan semoga mendapatkan PR untuk itu siap hari ini jika memungkinkan.

Selain itu, tampaknya Nilai y tidak benar-benar digunakan, karena garis sorotan hanya beralih dari contentTop ke contentBottom. Akar masalahnya sebenarnya di baris ini:

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

Jika y adalah NaN maka pt.x keluar sebagai NaN juga. Ini sebenarnya tampaknya bug Swift 3 / CoreGraphics, sebagaimana dibuktikan di Swift Repl di sini:

  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 dapatkah Anda mencoba cabang fix-1495 sini:

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

Dan lihat apakah itu berfungsi seperti yang diharapkan untuk Anda? Ini bekerja untuk saya. @danielgindi & @ liuxuan30, saya lebih atau kurang disalin kode dari ScatterChartRenderer tetapi menambahkan if x > chartXMax * animator.phaseX cek yang LineChartRenderer memiliki.

Saya tidak _think_ Saya harus mengulang lebih dari set.entriesForXValue(high.x) tetapi saat ini saya. Saya rasa tidak ada salahnya karena seharusnya tidak ada lebih dari satu entri, tetapi jika Anda dapat mengonfirmasi hal itu, saya akan dengan senang hati menciutkannya ke satu panggilan set.entryForXValue(high.x) dan mengirim PR.

Sebaiknya juga menambahkan opsi sorotan terprogram ke ChartsDemo untuk membantu pengujian regresi bug sorotan, tetapi saya belum menyelidiki apa yang diperlukan untuk melakukan itu.

Terima kasih atas upaya Anda @ryanschneider ! @danielgindi apa yang Anda pikirkan?

@ryanschneider Terima kasih atas usaha Anda. Saya mencoba perubahan di cabang Anda, tetapi kedua metode highlightValueWithX dan highlightValueWithHighlight masih tidak berfungsi untuk saya. Nilai y sorotan tetap NaN dan sorotan tidak menggambar pada bagan saat dipanggil secara terprogram.

@danielgindi Baru saja diuji dengan master terbaru, termasuk komit Anda di https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

highlightValueWithX masih tidak menampilkan garis sorotan. Delegasi dipecat dan nilai y sorotan masih NaN di delegasi. Seperti kasus sebelumnya, penyorotan melalui pengenal isyarat menampilkan garis sorotan, hanya tidak demikian saat highlightValueWithX dipanggil.

Masih tidak berhasil.

Masih tidak berfungsi untuk saya di 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)

    }

} `

Ubah baris ini: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

to: lineChartView.highlightValue (Sorotan (x: 3, y: 0, dataSetIndex: 0)

Saya mencoba menentukan ay: 0 pada grafik garis dengan beberapa set data dan masih tidak berhasil. Apakah ada pembaruan tentang ini? Itu bug yang cukup besar.

Saya menelepon dari Objective C.

Sedikit retasan untuk mendapatkan posisi nilai yang disorot

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

Saya mencoba peretasan Anda, jndefosse, tetapi bagaimana saya dapat memanggil fungsi untuk menampilkan label hanya ketika entri disorot?

Apakah bug ini diperbaiki? Sepertinya saya tidak bisa menyorot bagian di Bagan Pai di iOS 13.5 Swift 5.1

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Shunshine07 picture Shunshine07  ·  3Komentar

Bharati555 picture Bharati555  ·  4Komentar

kwstasna picture kwstasna  ·  3Komentar

guanyanlin picture guanyanlin  ·  3Komentar

BrandonShega picture BrandonShega  ·  4Komentar