1

凡例で関連するスウォッチの色をタップすると、プロットを非表示/表示しようとしましたが、ここに私のコードがあります:

-(void)configureLegend
{
    // 1 - Create styles
    CPTMutableTextStyle *axisTitleStyle = [CPTMutableTextStyle textStyle];
    axisTitleStyle.color = [CPTColor whiteColor];
    axisTitleStyle.fontName = @"Helvetica-Bold";
    axisTitleStyle.fontSize = 12.0f;
    CPTMutableLineStyle *axisLineStyle = [CPTMutableLineStyle lineStyle];
    axisLineStyle.lineWidth = 2.0f;
    axisLineStyle.lineColor = [CPTColor whiteColor];
    CPTMutableTextStyle *axisTextStyle = [[CPTMutableTextStyle alloc] init];
    axisTextStyle.color = [CPTColor whiteColor];
    axisTextStyle.fontName = @"Helvetica-Bold";
    axisTextStyle.fontSize = 11.0f;

    // Add legend
    CPTGraph *graph = self.hostView.hostedGraph;
    graph.legend                 = [CPTLegend legendWithGraph:graph];
    graph.legend.delegate = self;
    graph.legend.numberOfRows    = 2;
    graph.legend.textStyle       = axisTitleStyle;
    graph.legend.fill            = [CPTFill fillWithColor:[CPTColor darkGrayColor]];
    graph.legend.borderLineStyle = axisLineStyle;
    graph.legend.cornerRadius    = 5.0;
    graph.legend.swatchSize      = CGSizeMake(5.0, 5.0);
    graph.legendAnchor           = CPTRectAnchorBottom;
    graph.legendDisplacement     = CGPointMake(20.0, 35.0);
}


-(BOOL)legend:(CPTLegend *)legend shouldDrawSwatchAtIndex:(NSUInteger)idx forPlot:(CPTPlot *)plot inRect:(CGRect)rect inContext:(CGContextRef)context
{
    NSLog(@"\n Swatch Index = %d",idx);
    CPTGraph *graph = self.hostView.hostedGraph;
    if (CGRectEqualToRect(plot.legendRect, CGRectZero)) {
        plot.legendRect = CGRectUnion(graph.legend.frame, rect);
    }
    return !plot.hidden;
}

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

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

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

しかし、ここで直面している問題は、グラフに 7 つのプロットが含まれており、凡例で 2 行として表されていることです。最初の行の最初の凡例項目 (赤色) をタップすると、赤色のプロットが非表示になります。2 行目の最初の項目 (黄色) をタップすると、黄色のプロットが非表示になります。これはうまくいっています。最初の行の 3 項目 (青色) をタップすると、青色のプロットではなく赤色のプロットが再び非表示になります。2行目の黄色のプロットでも同じことが起こり、オレンジ色ではなく隠れています。

誰かが私が間違っている場所を提案し、正しい結果を得るためのアプローチを強調します。

4

1 に答える 1

1

凡例のデリゲートを使用して、ユーザーが凡例のエントリに触れたときに通知を受け取ります。これらのメソッドは、リリース 1.3 の後に追加されました。

-(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx;
-(void)legend:(CPTLegend *)legend legendEntryForPlot:(CPTPlot *)plot wasSelectedAtIndex:(NSUInteger)idx withEvent:(CPTNativeEvent *)event;
于 2013-09-18T23:56:33.773 に答える