Почему окно просмотра не переместится на последнее значение X моей линейной диаграммы?

Jim спросил: 28 марта 2018 в 04:49 в: swift

Я использую версию 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.

Любые идеи, почему это происходит?


1 ответ

Есть решение
Jim ответил: 07 апреля 2018 в 08:00

Я наконец понял это. Я выбирал данные, которые будут отображаться на диаграммах перед , и настраивал некоторые свойства диаграммы, которые должны быть установлены до установки 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)}