Charts: ドラッグ中およびドラッグ後にバーがレンダリングまたは非表示にならない

作成日 2017年03月13日  ·  30コメント  ·  ソース: danielgindi/Charts

BarChartViewを使用して棒グラフを作成しました。 ビューには、1日あたりの労働時間が表示されます。
残念ながら、一部のバーはまったくレンダリングされません。その他のバーは、グラフ全体をドラッグしている間に消えます。

チャートが最初に表示される前に、一度に7本のバーのみが表示されるようにズームされています。

barChart.zoom(scaleX:ceil(CGFloat(dataSet.xMax - dataSet.xMin) / 7), scaleY: 1, x: 0, y: 0)

次に、ビューがアニメーション化されるため、最新の日が最初に表示されます。

barChart.moveViewToAnimated(xValue: dataSet.xMax, yValue: dataSet.yMin, axis: barChart.rightAxis.axisDependency, duration: 0.8, easingOption: .easeInOutSine)

これは次の結果につながります-これまでのところ、とても良いです:

img_2071

チャートを右にドラッグするとすぐに、バーが消え始めます-値だけが表示されたままになります(Mo. 6thのバーに注意してください-消えました):

img_2072

また、さらに左にあるため(ズームのために)すぐに表示されないすべてのバーは、まったくレンダリングされません。 私が間違っているのは何ですか?

help wanted ★★

最も参考になるコメント

スタックバーBarChartData()したCombinedChartView 3.0.2でも同じ問題が発生します。
表示されているビューの外側で最も右側のデータエントリをズームおよびドラッグすると、バーが消え、データラベルが表示されます。 さらに、 .setVisibleXRangeMaximum()制限したり、 .moveViewToX()を介して左側を移動したりすることはまったくありません。

もう1つの奇妙な動作は、 .highlightPerTapEnabled()を介してすべてのバーを選択できないことです。たとえば、13のセットの中央のバーのみを選択できます。 これがまったく関係しているかどうかはわかりません。

解決済み:問題は、データ入力が逆の順序になっていることでした。 x値を増やしてデータエントリを並べ替えると、問題が解決しました。

全てのコメント30件

最初にあなたの側でデバッグする必要があります。
fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int)見てください。ここで、barRectが計算されます。
ズームの前後にデバッグしてください。barRectが失われる原因となる可能性があります。
いくつかのバーがまだそこにあり、ラベルの位置が正しいように見えるという事実を考えると、それは図書館またはあなたによるいくつかの単純な間違いである可能性があります。

ChartsDemoで再現できれば簡単です

この問題のテストケースを作成することができました。 残念ながら、実際に何が原因なのか理解できません。

テストケースを実行するには、Xcode 8.2.1のシミュレーターiPhone 6 (10.2)でターゲットChartsDemoします。 次に、グラフを右にドラッグすると、 Tue 7thの緑色のバーが消えます。

注目に値する:テストケースのコードは、属性付きチャートラベルに対するこのプルリクエストに基づいてい

簡単なチェックを行いました。欠落しているバーはすべてブレーク条件を満たしています。

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

しかし、原因は説明できません。 barRect'seem 'は正しく計算します

ご支援ありがとうございました; ほんとうにありがとう!

プルリクエストが問題を引き起こす可能性があるかどうかをもう一度考えてみました。 間違いなく変更されたのは、軸ラベルの描画方法です。これは、軸アイテムの幅に影響し、最終的にはbarRectにも影響しますか?

問題がa)プルリクエストのバグb)チャートライブラリのバグまたはc)単に間違った使用法が原因である場合、どのように絞り込むことができますか?

前回チェックしたとき、ライブラリをマスターに置き換えてみましたが、まだバグがあるようです。 交換して、再確認することができます。

viewPortHandler.isInBoundsRightは、機能ブランチがbarRectの計算を変更しない限り、影響を受けないはずです。

今のところ、間違って使用したとは言えません。これは、contentRectとbarrectのエッジの問題と同じです。

何が悪いのかを理解するために、長方形のエッジを調べる時間があまりないので、ごめんなさい。 ただし、ChartsDemoを試して同様のことを行い、再現できるかどうかを確認できます。

@danielgindi何かアイデアはありますか?

プルリクエストまたはこの問題に関するニュースは

何か? これを修正するにはどうすればよいですか?

@marbetschar前回このバグにマスターブランチを使用したときのことを覚えていますが、それでも発生するので、PRとは関係ありません。

しかし、私にはマトリックスを見る時間がありません。

ここでの重要な問題は、なぜそれが条件を超えているのかということだと思います。 バーの長方形を計算しているときに明らかな問題は見られません。

時間があれば、barRectの計算を検討し始めることができます。

具体的には、バーがない場合でも、その上のラベルは正しい位置にとどまっているので、barRectエッジの問題についてです。

削除してみてください

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

また、バーが適切な位置とサイズにあるかどうかを確認してください。これにより、エッジの問題だけが問題であるかどうかを判断できます。

@marbetschar私はまったく同じ問題を抱えています、あなたはそれを解決する方法を見つけましたか?

@jeffalee残念ながら、私はまだこの問題を

@marbetschar @jeffaleeこの問題はviewPortHandlerに関連していますか?

3.0.2でも同じ問題が発生しています。または、同じ問題のようです。 これについて助けていただければ幸いです。

self.chartView.data = getChartData() // .count == 25
self.chartView.setVisibleXRangeMaximum(10) 
self.chartView.moveViewToX(20)

左右にスクロールすると、最後の10個のデータバーのみがレンダリング/表示されます。

  • 最後のバーが範囲外になると、バーの値がフェードアウトし、
  • 最後が範囲外になると、描画されたすべてのバーが消えました。
  • xAxisラベルは残りました

最後の2行を削除すると、グラフは正しくレンダリングされます。

@perwylコードにまったく同じ2行があります。 だから私はあなたが同じ問題に遭遇したと主張します。 @ liuxuan30は少し調査したところ、これは確かにviewPortHandlerに関連していることがわかりました。

残念ながら、私は現在これを掘り下げる時間がありません。 ぜひお試しください。

@marbetschar大丈夫。 確認していただきありがとうございます。

スタックバーBarChartData()したCombinedChartView 3.0.2でも同じ問題が発生します。
表示されているビューの外側で最も右側のデータエントリをズームおよびドラッグすると、バーが消え、データラベルが表示されます。 さらに、 .setVisibleXRangeMaximum()制限したり、 .moveViewToX()を介して左側を移動したりすることはまったくありません。

もう1つの奇妙な動作は、 .highlightPerTapEnabled()を介してすべてのバーを選択できないことです。たとえば、13のセットの中央のバーのみを選択できます。 これがまったく関係しているかどうかはわかりません。

解決済み:問題は、データ入力が逆の順序になっていることでした。 x値を増やしてデータエントリを並べ替えると、問題が解決しました。

@kscheffどのような問題が解決したと思いますか? あなただけですか、それとも@marbetscharですか?

@ liuxuan30 @ marbetscharの問題を確認できませんでした。 バーが見つからないという同様の問題があることだけがわかりました。これは、値を並べ替えることで解決できました。 したがって、 @ marbetscharにデータセット内のエントリを並べ替えることを

ありがとう、わかった

@kscheffどのように解決しますか

 Another strange behavior is that I cannot select all bars via .highlightPerTapEnabled(), only the center bar in a set of e.g. 13 is selectable. Not sure if this is related at all.

@perwylこの問題は、並べ替えでも解消されました。

@kscheffありがとう! 私は実際にreturn yVals.reversed()を実行する必要があり、この背後にあるロジックが何であるかわかりません。

データを並べ替えると、ズーム中にグラフが正しくプロットされるのは素晴らしいことです。 ソートアクションは、デフォルトで「notifyDataSetChanged」メソッドのポッドに含めることができますか、それとも他の場所に含めることができますか? PRをするべきですか?

問題の内容や根本原因などを詳細にPRしてください。これはかなりの時間と会話であり、この投稿と同じ問題であるかどうかはわかりません。

これを行う場合(そしてそうすべきだと思います)、データを追加する唯一の方法は順序付けられた方法である必要があると思います。

並べ替えまたはこの問題? 並べ替えは、私が覚えているユーザーによって処理されていました。

並べ替えまたはこの問題? 並べ替えは、私が覚えているユーザーによって処理されていました。

私が見るように、それはチャート内のデータの誤った表現を引き起こします-したがって、ソートされたデータを準備することは明らかではないようです(x値を持っています-したがって、正しく描画するための必要十分条件が定義されています)。 それで、おそらくポッドは自給自足であり、非自明な要件を必要としないはずですか? 私見では
私は数日以内にPRを準備します、この論理が明白であることを願っています。

私は棒グラフのみを使用していますが。 ある種のチャートが影響を受ける可能性があります。 しかし、実際には、最初に正しく描画する方法がわかりません。また、論理的な観点からグラフのズーム部分を描画する際に問題が発生します。

@ liuxuan30私の理解では、この問題はデータがソートされていないことが原因であると理解しています。 私は何かが足りないのですか?

ここで推測していますが、データが常に並べ替えられている場合は、パフォーマンスを向上させるためにレンダリングで仮定を行うこともできます。

正直覚えていません。 私が最後に調べたのは私が見つけた

if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

2つの条件のいずれかが満たされていないため、バーはレンダリングされません。 @marbetscharはそれ以降更新されていないため、元の問題の根本的な原因が、 @ kscheffが提供したもののように、並べ替えに関連しているかどうかは

ねえ、みんな! この問題に関するニュースはありますか? バージョン3.3.0を使用し、BarChartViewでも同じ問題が発生します。 yAxis値をソートしないことが重要な場合にそれを修正する方法はありますか?

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