Как сбросить анимацию iOS-Charts в ячейке tableview

Я использую линейную диаграмму из iOS-Charts в настраиваемой ячейке tableview, которая расширяется при касании. Я не загружаю диаграммы в cellForRow: поскольку это загружает все диаграммы во всех ячейках и снижает производительность прокрутки, поэтому я загружаю их в didSelectRow :. Проблема в том, что по какой-то причине диаграмма не загружается при первом прикосновении пользователя к ячейке, и я понятия не имею, почему. Кроме того, кажется, что анимация диаграммы начинается, когда развернутая ячейка (которая в настоящее время показывает диаграмму) свернута.

Вот мой didSelectRow: а ниже - функция построения графиков в моей пользовательской ячейке. Я боролся с этим, я буду благодарен за любое понимание!

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

      let cell:CandDetailTableViewCell = tableView.cellForRowAtIndexPath(indexPath) as! CandDetailTableViewCell

      // CALLS METHOD TO BUILD CHART WITH DATA I SAVED IN THESE ARRAYS
      cell.setChart(dataForMonths, values: dataForRatings)

      let previousIndexPath = selectedIndexPath

      if indexPath == selectedIndexPath {

         // if user taps cell that was already selected so it collapses
         selectedIndexPath = nil

      } else {

         // when user selects new cell
         selectedIndexPath = indexPath
      }

      var indexPaths:Array <NSIndexPath> = []

      if let previous = previousIndexPath {

         indexPaths += [previous]
      }

      if let current = selectedIndexPath {

         indexPaths += [current]
      }

      if indexPaths.count > 0 {

         tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
      }

      tableView.scrollRectToVisible(tableView.rectForRowAtIndexPath(indexPath), animated: true)
   }

Вот функция диаграммы в ячейке tableview:

func setChart(dataPoints: [String], values: [Double]) {

          var dataEntries: [ChartDataEntry] = []

          for i in 0..<dataPoints.count {

             let dataEntry = ChartDataEntry(value: values[i], xIndex: i)

             dataEntries.append(dataEntry)
          }

          let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Rating")
          let lineChartData = LineChartData(xVals: dataPoints, dataSet: lineChartDataSet)

          analyticsView.data = lineChartData
          analyticsView.xAxis.labelPosition = .Bottom
          analyticsView.backgroundColor = UIColor.whiteColor()

          analyticsView.userInteractionEnabled = false
          analyticsView.drawGridBackgroundEnabled = false
          analyticsView.drawBordersEnabled = false
          analyticsView.leftAxis.enabled = false
          analyticsView.rightAxis.enabled = false
          analyticsView.xAxis.gridLineWidth = 0.0
          analyticsView.xAxis.axisLineColor = UIColor.clearColor()

          analyticsView.legend.enabled = false

          // Removes the description text off the chart
          analyticsView.descriptionText = ""

          analyticsView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0)
       }

person tahoecoop    schedule 09.11.2015    source источник


Ответы (1)


сначала введите analyticsView.data = lineChartData после настройки представления чата. Ему нужно прочитать некоторые свойства, чтобы выполнить некоторую математику;

во-вторых, когда и где вы добавляете представление диаграммы в представление содержимого ячейки?

Кроме того, это кажется немного странным, когда вы вызываете tableView.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic) в didSelectRow. Я полагаю, вам следует добавить здесь представление диаграммы в представление содержимого ячейки, а не перезагружать данные? Потому что это вызовет еще один cellForItemAtIndexPath и переопределит то, что вы сделали?

в основном, когда вы делаете addSubView, он начинает рисовать диаграмму. Вы можете добавить точку разрыва в addSubView и drawRect на линейном графике и посмотреть, может ли он сломаться, когда вы нажмете на ячейку.

Вы также можете вручную запустить перерисовку с помощью chartView.setneedsDisplay

Обновлять:

Если вы хотите сбросить анимацию, вызовите API анимации еще раз и, возможно, еще один setNeedsDisplay

person Wingzero    schedule 10.11.2015
comment
Я изменил analyticsView.data = lineChartData, чтобы он находился в конце после того, как он настроил представление диаграммы; он по-прежнему работает так же. Я добавляю представление диаграммы, когда вызываю cell.setChart(dataForMonths, values: dataForRatings) в didSelectRow: и отображаю его в UIView в своей ячейке. - person tahoecoop; 11.11.2015
comment
тогда вы должны начать отладку при вызове drawRect - person Wingzero; 11.11.2015