Как добавить распознавание жестов касания в круговую диаграмму Swift3 IOS?

Я нахожусь в процессе разработки приложения IOS для небольшой практики с использованием Swift 3. Внутри этого приложения я хотел бы иметь круговую диаграмму. Чтобы построить круговую диаграмму, я перешел по этой ссылке, и круговая диаграмма становится сгенерировано.

Теперь я хочу добавить еще один функционал. Когда пользователь нажимает на одну из областей круговой диаграммы, как и в любой другой месяц, он должен открывать новый контроллер и отображать сведения только об этом месяце.

Мне удалось добавить функцию распознавания жестов. Но когда я нажимаю на любую часть экрана, открывается новый экран. Я хочу ограничить эту функциональность крана только разделом круговой диаграммы, и этот месяц круговой диаграммы должен быть захвачен. Код

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))

pieChartView.addGestureRecognizer(gestureRecognizer)

И код крана ручки

func handleTap(gestureRecognizer: UIGestureRecognizer) {
let monthDetail = storyboard?.instantiateViewController(withIdentifier: "MonthTableView") as! MonthDetailsTableViewController
monthDetail = month  //Should be the month value of Tap area
navigationController?.pushViewController(monthDetail, animated: true)

}

Ценю любую помощь!!

==========================

Обновленный код

import UIKit
import Charts
import CoreData

class ExpenseViewController: UIViewController, ChartViewDelegate {

@IBOutlet weak var pieChartView: PieChartView!

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
    var unitsSold = [10.0, 20.0, 10.0, 30.0, 10.0, 10.0]

     override func viewDidLoad() {
        super.viewDidLoad()

        setChart(dataPoints: months, values: unitsSold)

        pieChartView.delegate = self
     }

     func setChart(dataPoints: [String], values: [Double]) {
        var dataEntries: [ChartDataEntry] = []

        for i in 0..<dataPoints.count {
            let dataEntry = PieChartDataEntry(value: values[i], label: dataPoints[i])
            dataEntries.append(dataEntry)
        }


        let pieChartDataSet = PieChartDataSet(values: dataEntries, label: "Units Sold")
        let pieChartData = PieChartData(dataSet: pieChartDataSet)

        pieChartView.data = pieChartData

      }

     func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, dataSetIndex: Int, highlight: ChartHighlighter) {
        //print("\(entry.value) in \(months[entry.xIndex])")
        print("Y = \(entry.y) ")
        print("X = \(entry.x) ")
    }

}

person NGR    schedule 14.03.2017    source источник


Ответы (2)


Ознакомьтесь с частью Touch Events в вашем руководстве по Appcoda, вы найдете ChartViewDelegate метод chartValueSelected, поэтому вам нужно использовать этот метод вместо UITapGestureRecognizer.

func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
     print("\(entry.value) in \(yourArray[entry.xIndex])")
}
person Nirav D    schedule 14.03.2017
comment
Привет Нирав. Спасибо за ответ. Но даже после выполнения этих шагов, указанных в ссылке, функция chartValueSelected не вызывается. Интересно, почему? Я расширил класс с помощью ChartViewDeleage, добавил pieChartView.delegate = self, все еще не работает. - person NGR; 14.03.2017
comment
@NGR Пожалуйста, отредактируйте свой пост с текущим кодом и проверьте, правильно ли установлен делегат. - person Nirav D; 14.03.2017
comment
@NGR Вы работаете со Swift 3, и синтаксис делегата может измениться, поэтому, если у вас есть скопированный метод из моего ответа, попробуйте удалить и перепечатать самостоятельно, Xcode предложит вам правильный. - person Nirav D; 14.03.2017
comment
Да. Ты прав. Изменен метод, и он вызывается при нажатии. Теперь возникли проблемы с получением индекса Months. - person NGR; 14.03.2017
comment
Понятно. Используя highlight.x, я могу получить индекс месяца. Спасибо за вашу помощь. - person NGR; 14.03.2017
comment
@NGR Добро пожаловать, приятель :) - person Nirav D; 15.03.2017
comment
Привет, Нирав. Любая идея о том, как скрыть текст, который виден внутри круговой диаграммы? Я хочу отображать только числа в процентах/значениях, а не связанный с ними текст. - person NGR; 22.04.2017
comment
@NGR Не об этом, может быть, вам нужно задать новый вопрос - person Nirav D; 22.04.2017

В handleTap используйте locationInView распознавателя жестов, чтобы выяснить, в какой части диаграммы (если есть) находится касание, и отреагируйте соответствующим образом.

person matt    schedule 14.03.2017