Charts: 拖动期间和之后,条没有呈现或消失

创建于 2017-03-13  ·  30评论  ·  资料来源: danielgindi/Charts

我已经使用BarChartView创建了条形图。 该视图显示每天的工作时间。
不幸的是,有些条形图根本没有渲染-其他条形图在拖动整个图表时消失了。

在图表第一次显示之前,它被缩放为一次仅显示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 ★★

最有用的评论

我在CombinedChartView有3.0.2的问题,堆积条BarChartData()
在可视视图之外缩放和拖动最右边的数据条目时,条消失,数据标签在那里。 此外,我完全不限制.setVisibleXRangeMaximum()或通过.moveViewToX()移到左侧。

另一个奇怪的行为是我无法通过.highlightPerTapEnabled()选择所有条形图,只有一组(例如13个)中的中间条是可选的。 不确定是否完全相关。

已解决:问题在于数据条目的顺序相反。 通过增加x值对数据条目进行排序可以解决此问题。

所有30条评论

我需要您先进行调试。
看一下fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) ,它在其中计算barRect。
请在缩放前后进行调试,这可能会导致barRect丢失。
考虑到某些条形图仍然存在,并且标签位置似乎正确,这可能是库或您的一些简单错误。

如果您可以使用ChartsDemo复制它,将会更容易

我能够为这个问题创建一个

要运行测试用例,请在Xcode 8.2.1的模拟器iPhone 6 (10.2)中使用目标ChartsDemo 8.2.1 。 然后将图表拖到右侧,您会看到Tue 7th的绿色条消失。

值得注意的是:测试用例的代码基于对属性图表标签的拉取请求。 拉取请求提供的功能确实可以在xAxis上呈现日期,如您在屏幕快照中所见。 但是,我看不到为什么此请求会引起麻烦。

我做了一个快速检查,所有丢失的条都满足中断条件:

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

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

但是,我无法解释原因。 barRect“似乎”计算正确

非常感谢您的支持; 对此,我真的非常感激!

如果拉请求可能导致问题,请再三考虑。 绝对发生了变化的是轴标签的绘制方式,也许会影响轴项目的宽度,最终还影响barRect?

如果问题是由于a)拉取请求中的错误b)图表库中的错误或c)用法错误而导致的,我们如何缩小范围?

上一次检查时,我尝试用master替换库,但似乎仍然有问题。 您可以更换并仔细检查。

我猜viewPortHandler.isInBoundsRight不应该受到影响,只要特征分支不更改barRect计算即可。

现在,我不能说您错误地使用了它,就像contentRect和bar rect edge问题一样。

抱歉,我没有太多时间研究矩形边缘以找出问题所在。 但是您可以尝试ChartsDemo进行类似的操作,以查看是否可以重现。

@danielgindi有什么想法吗?

有关拉取请求或此问题的任何新闻吗?

任何事物? 我如何帮助您解决此问题?

@marbetschar我记得上次我使用master分支来解决此错误,并且它仍然会发生,因此不应与您的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标签

如果删除最后两行,则图表将正确呈现。

@perwyl我的代码中有两行完全相同; 所以我认为您遇到了同样的问题。 @ liuxuan30进行了调查,发现这确实与viewPortHandler

不幸的是,我目前没有任何时间来探讨这一点。 如果您尝试一下,将不胜感激。

@marbetschar好吧。 感谢您的确认。

我在CombinedChartView有3.0.2的问题,堆积条BarChartData()
在可视视图之外缩放和拖动最右边的数据条目时,条消失,数据标签在那里。 此外,我完全不限制.setVisibleXRangeMaximum()或通过.moveViewToX()移到左侧。

另一个奇怪的行为是我无法通过.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,详细说明问题的原因和根本原因等。这已经是相当长的时间了,并且一直在讨论,不确定它们是否与本文相同。

我认为,如果我们要这样做(并且我认为应该这样做),则添加数据的唯一方法应该是以有序方式。

排序还是这个问题? 我记得排序曾经是由用户照顾的。

排序还是这个问题? 我记得排序曾经是由用户照顾的。

如我所见,它会导致图表中数据的错误表示-似乎准备将数据排序是不明显的(它具有x值-因此已定义了绘制正确的必要和充分条件)。 那么也许pod应该是自给自足的,并且不需要非显而易见的要求? 恕我直言
我将在两天内准备PR,希望这种逻辑是显而易见的。

虽然我只使用条形图。 也许某些类型的图表可能会受到影响。 但是,实际上我不理解它如何才能正确地绘制,并且从逻辑的角度绘制图表的放大部分时遇到了问题。

@ liuxuan30我的理解是,此问题是数据未排序的结果。 我想念什么吗?

我在这里猜测,但是如果始终对数据进行排序,我们可能还可以在渲染中进行假设以提高性能。

老实说,我不记得了。 我上次查看时发现

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

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

这两个条件之一不满足,因此条形没有渲染。 自那时以来, @ marbetschar从未更新过,因此我不确定原始问题的根本原因是否与排序有关,例如@kscheff提供的内容。

大家好! 关于这个问题有什么消息吗? 使用版本3.3.0时,BarChartView仍然存在相同的问题。 有什么想法如何解决,以防万一不对yAxis值进行排序很重要?

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

相关问题

deepumukundan picture deepumukundan  ·  3评论

coop44483 picture coop44483  ·  3评论

brytnvmg picture brytnvmg  ·  4评论

cilasgimenez picture cilasgimenez  ·  4评论

Bharati555 picture Bharati555  ·  4评论