我希望如果 用户触摸某个特定的图例,那么我可以触发一些操作 ,比如显示该切片/条/图的详细信息。 除此之外是否有任何委托方法:
-(NSString *)legendTitleForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index
谢谢!
答案 0 :(得分:2)
截至目前,这在coreplot中不可用。您必须子类CPTLegend
类才能添加此功能。已有request for this here.
指向正确的方向。为了实现这一目标,您需要执行以下操作,
renderAsVectorInContext
以存储绘制了图例标题和样例的CGRect。对应于图例标题的框架之间应该有连接。-(BOOL)pointingDeviceDownEvent:(CPTNativeEvent *)event atPoint:(CGPoint)interactionPoint
并检查点击是否在上面存储的任何CGRect上。如果该点在该帧内,则需要调用委托方法并告知哪个Legend被点击。检查其他coreplot类中此方法的类似实现。在这种情况下应该几乎相似,以确定点击点是否位于此帧内。答案 1 :(得分: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中实现。
此致 Almir