如何将ios-chart约束为视图大小

时间:2016-04-23 17:37:13

标签: ios iphone swift ios-charts

编辑短版: 我正在使用具有动态数据的ios-charts显示图表,并且它正在关闭我的图表,因此图表的完整垂直部分未正确显示。某些操作(如从横向转换为纵向或反之亦然)将导致图形正确显示。

原始问题

我在运行ios 9.3的iPhone 6模拟器上使用ios-charts 2.2.4版显示一个折线图,我遇到了一个问题,其中内容被垂直剪切... 有时

该图表是一个向下钻取图表,通过选择另一个图表中的数据点触发。对于某些数据点,如果我选择它们 first ,则会对截断图表进行裁剪,如下所示:

Chart is clipped around 31 for some reason

但是,如果我先选择另一个数据点,然后重新选择这个刚刚被剪辑的相同数据点,那么图表会按预期呈现或多或少:

Chart is not clipped and extends to ~66 as expected

我手动设置图表的最大Y值,打印最大Y值确认它确实被设置,所以我不得不相信问题不在于图表格式,而在于方式图表限制了自己的观点?换句话说,也许这是一个布局/故事板问题,我可以在视图甚至父视图上设置一个属性来正确渲染?

尽管如此,这是我用来生成图表的代码,以防我做任何明显错误的事情:

... // Part where I actually get the data omitted bc its boring
let chartDataSet = LineChartDataSet(yVals: dataEntries, label: "")
let chartData = LineChartData(xVals: xVals, dataSet: chartDataSet)
drilldownChart.data = chartData
formatChart(drilldownChart, yMax: [runningTotal, Double(goal.target)].maxElement()!)
chartDataSet.colors = [UIColor.blackColor()]
chartDataSet.circleColors = [UIColor.blackColor()]
chartDataSet.drawCirclesEnabled = false
chartDataSet.drawFilledEnabled = true
chartDataSet.fillColor = UIColor.blackColor()
chartDataSet.fillAlpha = 1.0
chartDataSet.valueColors = dataPointLabelColors
print(drilldownChart.chartYMax) // Still prints 66, y'know, just in case

// Format a chart by eliminating grid lines, decimals, right axis, etc.
func formatChart(chart: BarLineChartViewBase, yMax: Double) {
    let formatter = NSNumberFormatter()
    formatter.minimumFractionDigits = 0
    chart.xAxis.labelPosition = .Bottom
    chart.xAxis.gridColor = UIColor.clearColor()
    chart.leftAxis.axisMinValue = 0.0
    chart.leftAxis.valueFormatter = formatter
    chart.leftAxis.granularity = 1 // Sets a minimum granularity, but allows for higher granularities
    chart.leftAxis.axisMaxValue = [1.0, yMax * 1.1].maxElement()!
    chart.leftAxis.gridColor = UIColor.clearColor()
    chart.rightAxis.enabled = false
    chart.legend.enabled = false
    chart.data!.setValueFormatter(formatter)
    if (chart.data!.xValCount > 20) { chart.data!.setDrawValues(false) }
    chart.descriptionText = ""
    chart.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .Linear)
    chart.pinchZoomEnabled = false
    chart.doubleTapToZoomEnabled = false

    let limit = ChartLimitLine(limit: Double(goal!.target), label: "")
    limit.lineColor = UIColor.blackColor()
    limit.lineDashLengths = [4.0, 2.0]
    chart.leftAxis.addLimitLine(limit)
    print(chart.leftAxis.axisMaxValue) // prints 66
    print(chart.chartYMax) // Prints 66
}

编辑故事板设置被忽略,因为它们很大并且结果不相关

1 个答案:

答案 0 :(得分:0)

答案是在绘图函数的末尾添加notifyDataSetChanged()

我在MPAndroid Chart(ios-Charts的Android版本)上找到的this documentation

  

notifyDataSetChanged():让图表知道它的[原文如此]基础数据已经改变并执行所有必要的重新计算(偏移,图例,最大值,最小值,......)。特别是在动态添加数据时需要这样做。