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

Why won't the viewport move to the last X value of my line chart?

我使用的是 3.1.1 版。图表框架,我无法让视口向右移动足够远以显示最后一个值。如果我转到我的 ChartViewController 并且当前 selection 有数据要显示,它会移动到图表中的一个点,使 7 个数据点不在右侧的视野范围内。但是,如果我然后 select 另一个没有任何数据的项目,然后 select 前一个有数据的项目,它会正确移动图表,以便最后一个数据点可见:

生成 selection 后,我获取适当​​的数据:

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

    UserDefaults.setSelectedLiftForChart(selectedLift)
    delegate.fetchLiftEvents()

}

fetchLiftEvents() 中,如果没有数据,我将 chartView.data 设置为 nil,这似乎是我第一次转到 ChartViewController 和 select 一个没有数据的项目并重新select 上一个项目:

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([=11=].date.timeIntervalSince1970 / 86400) })

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

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

    generatexAxisDates(liftEvents: sortedLiftEvents)

    generateLineData(liftEvents: sortedLiftEvents)

}

generatexAxisDates(liftEvents: sortedLiftEvents)generateLineData(liftEvents: sortedLiftEvents) 都在 viewDidLoad() 中被调用,我的意思是它们在视图加载时以及带有数据的新 selection 时被调用被选中。我在 generateLineData(liftEvents:) 中调用 setVisibleXRange(minXRange:maxXRange:) 所以它也总是被调用:

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 上的文档和问题,并查看了 SO 上的许多相关问题,但我无法使其正常工作。 似乎正在解决我遇到的同样问题,但在尝试将解决方案应用于我的问题后,它仍然存在。

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

更新

我找到了解决问题的可能线索。当我第一次转到图表视图(屏幕截图 1)时,chartView 的边界在我 select 一个没有数据的项目然后重新 select Deadlift 之后是不同的(屏幕截图 2 和 3) :

在每种情况下都是完全相同的数据集,但最初高度为 389,但随后变为 433。我猜这一定会影响缩放比例,但我无法找到chartView 已设置。

知道为什么会这样吗?

我终于明白了。我正在获取将在图表上显示的数据 设置一些应该在设置 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)

}