2

我希望如果用户触摸特定的图例,那么我可以触发一些动作,比如显示该切片/条形图/图的详细信息。除了:

-(NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index

谢谢!

4

2 回答 2

2

到目前为止,这在 coreplot 中不可用。您必须对类进行子CPTLegend类化才能添加此功能。这里已经有这个要求了。

只是为了给你指出正确的方向。为了实现这一点,您需要执行以下操作,

  1. 修改方法renderAsVectorInContext以存储绘制图例标题和样本的 CGRect。与图例标题对应的框架之间应该有连接。
  2. 修改方法-(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint并检查点击是否在上面存储的任何这些 CGRect 上。如果该点在该框架内,您需要调用一个委托方法并告诉哪个 Legend 被点击了。在其他 coreplot 类中检查此方法的类似实现。在这种情况下,识别敲击点是否位于该框架内应该几乎是相似的。
于 2012-11-23T09:16:10.957 回答
0

我在我的 coreplot 子类中实现了它。这是我做的事情(可能不是最好的方法,但我在这里工作):

1-为CPlot创建一个类别,并添加一个名为CGRect legendRect的属性;

2-在初始化绘图时,将此属性设置为每个绘图的 CGRectZero;

3-添加协议 CPTLegendDelegate 并实现以下方法:

-(BOOL)legend:(CPTLegend *)legend shouldDrawSwatchAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot inRect:(CGRect)rect inContext:(CGContextRef)context
{
    if (CGRectEqualToRect(plot.legendRect, CGRectZero)) {
        plot.legendRect = CGRectUnion(self.graph.legend.frame, rect);
    }
    return !plot.hidden;
}

3-添加协议CPTPlotSpaceDelegate并实现以下方法:

-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(UIEvent *)event atPoint:(CGPoint)point
{
    if (CGRectContainsPoint(self.graph.legend.frame, point)) {

       CGPoint pointInLegend = CGPointMake(point.x - self.graph.legend.frame.origin.x, point.y - self.graph.legend.frame.origin.y);

        [self.graph.allPlots enumerateObjectsUsingBlock:^(CPTPlot *plot, NSUInteger idx, BOOL *stop) {
            if (CGRectContainsPoint(plot.legendRect, pointInLegend))
            {
                //here you can do whatever you need
                plot.hidden = !plot.hidden;
                [self configureLegend]; 
                *stop = YES;
            }
        }];
    }
    return YES;
}

当用户触摸图例项(样本或标签)时,图例将被隐藏。可能这可以在 coreplot 中实现。

问候, 阿尔米尔

于 2012-12-19T10:41:08.797 回答