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 のいずれかにあるかどうかを確認します。ポイントがそのフレーム内にある場合は、デリゲート メソッドを呼び出して、どの凡例がタップされたかを伝える必要があります。他のコアプロット クラスでこのメソッドの同様の実装を確認してください。この場合、タップのポイントがこのフレーム内にあるかどうかを識別するのは、ほぼ同じはずです。
于 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;
}

ユーザーが凡例項目 (スウォッチまたはラベル) に触れると、タッチしたプロットが非表示になります。おそらく、これはコアプロット内で実装できます。

よろしく、アルミール

于 2012-12-19T10:41:08.797 に答える