2016-10-11 8 views
0

Я использую файлы Core Plot для создания диаграммы. Но CorePlot не содержит события «click item legend».Clickable legend на Core Plot

Как я могу обнаружить пользовательский клик по элементу легенды?

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 
} 

ответ

2

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

+0

спасибо! оно работает – Kirill

0

Если вы копаться в исходный код ядра Заговор, вы можете следить за наследство цепочку 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) pointingDeviceDownEvent: (ненулевая CPTNativeEvent *) событие atPoint: (CGPoint) interactionPoint;

- (BOOL) pointingDeviceUpEvent: (nonnull CPTNativeEvent *) событие atPoint: (CGPoint) interactivePoint;

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

+0

pointingDeviceDownEvent и pointingDeviceUpEvent всегда возвращают false. Как определить местоположение и размеры «легенды»? Если легенда будет содержать длинные слова, эта легенда будет длиннее – Kirill