为什么视口不会移动到折线图的最后一个 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)
}
我使用的是 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)
}