Я использую версию 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 и посмотрел на многие связанные вопросы по SO, но я не могу заставить это работать. Этот вопрос , по-видимому, касается той же самой проблемы, с которой я столкнулся, но после попытки применить решение к моей проблеме он по-прежнему сохраняется.
что-нибудь еще, что кто-то может предложить попробовать?
Обновить
Я нашел возможный ключ к проблеме. Когда я сначала перехожу к графическому представлению (снимок экрана 1), границы chartView
отличаются после выбора элемента без данных, а затем повторного выбора Deadlift (скриншоты 2 и 3):
Это тот же самый набор данных в каждом случае, но изначально высота 389, но затем изменяется на 433. Я предполагаю, это должно повлиять на масштабирование, но я не смог найти, где и как устанавливаются границы chartView
.
Любые идеи, почему это происходит?
Я наконец понял это. Я выбирал данные, которые будут отображаться на диаграммах перед , и настраивал некоторые свойства диаграммы, которые должны быть установлены до установки
chartView.data = data
. Теперь я устанавливаю эти свойства по умолчанию перед извлечением и настройкой данных, и это работает: