为什么视口不会移动到折线图的最后X值?

时间:2018-04-21 18:29:14

标签: swift ios-charts

我正在使用3.1.1版。图表框架,我无法让视口向右移动到足以显示最后一个值。如果我转到我的ChartViewController并且当前选择有要显示的数据,它将移动到图表中的一个点,该点将7个数据点留在右侧视图之外。但是,如果我然后选择另一个没有任何数据的项目,然后选择上一个包含数据的项目,它会正确移动图表,以便显示最后一个数据点:

enter image description here

选择后,我会获取相应的数据:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    let selectedLift = lifts[row]

    UserDefaults.setSelectedLiftForChart(selectedLift)
    delegate.fetchLiftEvents()

}

fetchLiftEvents()中,如果没有数据,我将chartView.data设置为nil,这似乎是我第一次转到ChartViewController时和选择项目时发生的情况之间的唯一区别没有数据并重新选择上一项:

func fetchLiftEvents() {

    let liftName = UserDefaults.selectedLiftForChart()
    let liftEvents = dataManager.fetchLiftsEventsOfTypeByName(liftName)

    guard liftEvents.count > 0 else {
        chartView.noDataText = "There's no \(liftName) data to display"
        chartView.data = nil

        return }

    // put them into a Dictionary grouped by each unique day
    let groupedEvents = Dictionary(grouping: liftEvents, by: { floor($0.date.timeIntervalSince1970 / 86400) })

    // grab the maximum 1RM from each day
    let dailyMaximums = groupedEvents.map { $1.max(by: { $0.oneRepMax < $1.oneRepMax }) }

    // MARK: - TODO: Fix the silly unwrapping
    sortedLiftEvents = dailyMaximums.sorted(by: { $0?.date.compare(($1?.date)!) == .orderedAscending }) as! [LiftEvent]

    generatexAxisDates(liftEvents: sortedLiftEvents)

    generateLineData(liftEvents: sortedLiftEvents)

}

generatexAxisDates(liftEvents: sortedLiftEvents)generateLineData(liftEvents: sortedLiftEvents)都在viewDidLoad()中调用,我的观点是,当视图加载时以及选择带有数据的新选择时,它们会被调用。我在setVisibleXRange(minXRange:maxXRange:)中呼叫generateLineData(liftEvents:),因此它也会被调用:

func generateLineData(liftEvents: [LiftEvent]) {

    // generate the array of ChartDataEntry()...

    // generate set = LineChartDataSet(values: values, label: "Line DataSet")

    let data = LineChartData(dataSet: set)

    chartView.data = data

    chartView.setVisibleXRange(minXRange: 7.0, maxXRange: 7.0)
    chartView.moveViewToX(chartView.chartXMax)

    resetxAxis()

    chartView.configureDefaults()

    chartView.animate(yAxisDuration: 0.8)

}

resetxAxis()只是这样做:

func resetxAxis() {
    let xAxis = chartView.xAxis
    xAxis.labelPosition = .bottom
    xAxis.axisMinimum = 0
    xAxis.granularity = 1
    xAxis.axisLineWidth = 5
    xAxis.valueFormatter = self
}

我搜索了Github上的文档和问题,并查看了许多相关的问题,但是我无法让它工作。 This question似乎正在解决我遇到的同样问题,但在尝试将解决方案应用到我的问题后,它仍然存在。

还有什么人可以建议尝试吗?

更新

我发现了问题的可能线索。当我第一次转到图表视图(屏幕截图1)时,在我选择没有数据的项目然后重新选择Deadlift(屏幕截图2和3)后,chartView的界限会有所不同:

enter image description here

在每种情况下都是相同的数据集,但最初高度为389但随后更改为433.我猜这必须影响缩放但我无法找到{{的边界的位置或方式1}}已设置。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我终于明白了。我在设置一些应在设置chartView.data = data之前设置的图表属性之前获取将在图表上显示的数据。我现在在获取和设置数据之前设置这些默认属性,它可以工作:

extension BarLineChartViewBase {
    func configureDefaults() {
    backgroundColor = NSUIColor(red: 35/255.0, green: 43/255.0, blue: 53/255.0, alpha: 1.0)

    chartDescription?.enabled = false

    legend.enabled = false

    xAxis.labelPosition = .bottom
    xAxis.avoidFirstLastClippingEnabled = false
    xAxis.gridColor.withAlphaComponent(0.9)

    rightAxis.enabled = false // this fixed the extra xAxis grid lines
    rightAxis.drawLabelsEnabled = false

    for axis in [xAxis, leftAxis] as [AxisBase] {
        axis.drawAxisLineEnabled = true
        axis.labelTextColor = .white
    }

    noDataTextColor = .white
    noDataFont = NSUIFont(name: "HelveticaNeue", size: 16.0)

}