我希望如果用户触摸特定的图例,那么我可以触发一些动作,比如显示该切片/条形图/图的详细信息。除了:
-(NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index
谢谢!
我希望如果用户触摸特定的图例,那么我可以触发一些动作,比如显示该切片/条形图/图的详细信息。除了:
-(NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index
谢谢!
到目前为止,这在 coreplot 中不可用。您必须对类进行子CPTLegend
类化才能添加此功能。这里已经有这个要求了。
只是为了给你指出正确的方向。为了实现这一点,您需要执行以下操作,
renderAsVectorInContext
以存储绘制图例标题和样本的 CGRect。与图例标题对应的框架之间应该有连接。-(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint
并检查点击是否在上面存储的任何这些 CGRect 上。如果该点在该框架内,您需要调用一个委托方法并告诉哪个 Legend 被点击了。在其他 coreplot 类中检查此方法的类似实现。在这种情况下,识别敲击点是否位于该框架内应该几乎是相似的。我在我的 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 中实现。
问候, 阿尔米尔