我正在使用3.1.1版。图表框架,我无法让视口向右移动到足以显示最后一个值。如果我转到我的ChartViewController
并且当前选择有要显示的数据,它将移动到图表中的一个点,该点将7个数据点留在右侧视图之外。但是,如果我然后选择另一个没有任何数据的项目,然后选择上一个包含数据的项目,它会正确移动图表,以便显示最后一个数据点:
选择后,我会获取相应的数据:
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
的界限会有所不同:
在每种情况下都是相同的数据集,但最初高度为389但随后更改为433.我猜这必须影响缩放但我无法找到{{的边界的位置或方式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)
}