Интерактивная легенда на основном графике

#swift #macos #core-plot #legend #clickable

#swift #macos #основной график #легенда #интерактивная

Вопрос:

Я использую файлы Core Plot для создания своей диаграммы. Но CorePlot не содержит события «щелчок по элементу легенды».

Как я могу определить щелчок пользователя по элементу легенды?

 class ViewController: NSViewController, CPTPlotDataSource, CPTPieChartDataSource {

@IBOutlet weak var graphView: CPTGraphHostingView!

override func viewDidLoad() {
    super.viewDidLoad()

    let graph = CPTXYGraph(frame: CGRect.zero)        
    var axes = graph.axisSet as! CPTXYAxisSet
    var lineStyle = CPTMutableLineStyle()
    lineStyle.lineWidth = 0
    axes.xAxis?.axisLineStyle = lineStyle
    axes.yAxis?.axisLineStyle = lineStyle


    var pie = CPTPieChart()
    pie.pieRadius = 100
    pie.dataSource = self
    pie.centerAnchor = CGPoint(x: 0.18, y: 0.75)
    graph.add(pie)        

    var theLegend=CPTLegend(graph: graph)
    var legendFill=CPTFill(color: CPTColor.gray())
    theLegend.fill = legendFill
    var legendLineStyle = CPTMutableLineStyle()
    legendLineStyle.lineColor = CPTColor.white()
    theLegend.borderLineStyle = legendLineStyle
    theLegend.cornerRadius = 2.0
    theLegend.frame = CGRect(x: 0, y: 0, width: 0.1, height: 50)
    theLegend.numberOfColumns = 1

    graph.legend = theLegend
    graph.legendDisplacement = CGPoint(x: 0.5, y: 300)

    self.graphView.hostedGraph = graph
}
  

Ответ №1:

Легенды основного сюжета могут иметь делегат, который вызывается при наведении курсора мыши, наведении курсора мыши и / или выборе (наведение курсора мыши, за которым следует наведение курсора мыши на тот же элемент). события. См. Протокол CPTLegendDelegate для получения подробной информации о доступных методах. Если вам не нужно какое-то конкретное поведение, не охватываемое делегатом, вам не нужно беспокоиться о цепочке ответчиков.

Ответ №2:

Если вы углубитесь в исходный код Core Plot, вы сможете проследить цепочку наследования CPTLegend вплоть до CPTLayer:

https://github.com/core-plot/core-plot/blob/master/framework/Source/CPTLegend.h
https://github.com/core-plot/core-plot/blob/master/framework/Source/CPTBorderedLayer.h
https://github.com/core-plot/core-plot/blob/master/framework/Source/CPTAnnotationHostLayer.h
https://github.com/core-plot/core-plot/blob/master/framework/Source/CPTLayer.h

Если вы проверите файл заголовка для CPTLayer, он соответствует CPTResponder, и если вы перейдете к источнику для CPTResponder:

https://github.com/core-plot/core-plot/blob/master/framework/Source/CPTResponder.h

Вы заметите, что среди прочих есть два соответствующих метода:

-(BOOL)Указывающее событие devicedownevent:(ненулевое CPTNativeEvent *) событие в точке:(CGPoint)Точка взаимодействия;

-(BOOL)pointingDeviceUpEvent:(nonnull CPTNativeEvent *) событие в точке:(CGPoint)Точка взаимодействия;

Я думаю, вы, вероятно, можете сделать подкласс CPTLegend и переопределить один или оба метода в зависимости от ваших потребностей в обнаружении кликов.

Комментарии:

1. Указывающие devicedownevent и указывающие deviceupevent всегда возвращают false . Как я могу определить местоположение и размеры «легенды»? Если легенда будет содержать длинные слова, эта легенда будет длиннее