Core plotでタップした点のみ大きさを変えたい

iPhone

iPhoneアプリでグラフを表示させたいとき、メジャーなプラグインはCore plotだということで決定しました。
なので、Core plotでの点の加え方を以下で説明しました。

Core Plotでグラフに点を表示する

今回は、
&size(30){どうしてもCore plotでタップした点だけ大きさを変えたい!!できたら大きくしたい!};

という要望に応えます。

まず以下を書きます

 @interface CorePlotSampleViewController () {
      int selectedIndex_;
      BOOL didSelectedSymbol_;
 }

selectedIndex はタップされたグラフ上の点のindexです。
( グラフの点は配列に格納されています。)
didSelectedSymbol はグラフ上の点がタップされたかどうか否かです。
これがないとグラフが表示された時点で一番最後の点が大きくなってしまいます。
今回はタップしたときにタップした点を大きくしたいのです。

次に、以下のメソッドを加えます

 - (void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index withEvent:(UIEvent *)event

これは、グラフ上の点がタップされたときに呼ばれます。
全然呼ばれないんだけど!って人は、CPTScatterPlotのdelegateを確認してください。

次に、上記のメソッド内に以下を書きます。

 selectedIndex_ = index;
 didSelectedSymbol_ = TRUE;
 [plot reloadData];

selectedIndex_ にはタップされたindexを、
didSelectedSymbolをTRUEにすることで点がタップされた!ということをわからせます。

 [plot reloadData];

上記は、グラフを再描画しますよ ということです。
これでタップされた点のみ大きくするためには、グラフを描き直さないといけませんので必要になります。

次に、以下のメソッドを変更します。

 - (CPTPlotSymbol *)symbolForScatterPlot:(CPTScatterPlot *)plot recordIndex:(NSUInteger)index

以下のコードを加えてください。

 if (selectedIndex_ != NSNotFound
        && selectedIndex_ == index
        && didSelectedSymbol_)
 {
        plotSymbol.size = CGSizeMake( 16.0, 16.0);
 }

これの意味は、
点がタップされていて、かつタップされた点のindexがあって、かつそのindexと同じindexだったら、点の大きさを大きくするぜ!
ということになります。
&color(red){要はタップされた点だけ大きさを16にするよ、ということです。};

これでタップされた点のみ大きくすることができます。

&size(30){しかし、これだけだと大きくなった点を元の大きさに戻すことができません!!!};

ということで、以下のメソッドを加えてみましょう

 -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point

これはグラフがタップされたときに呼ばれます。
呼ばれないんだけどまたdelegate!?という方その通りです!

グラフのベースとなる

 CPTXYPlotSpaceのインスタンス

または

 CPTGraphのインスタンス.defaultPlotSpace

のdelegateを確認してください。

これで呼ばれるようになったかと思いますので、以下のコードを書いてみてください。

 -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point
 {
    
    if (!didSelectedSymbol_)
    {
        CPTScatterPlot *plot = (CPTScatterPlot*)[ graphHosting.hostedGraph plotWithIdentifier: あなたが名付けた名前];
    selectedIndex_ = NSNotFound;
    [plot reloadData];
    }
    
    didSelectedSymbol_ = FALSE;
    
 }

ここでは、大きくなった点をもとの大きさに戻すということをしています。

上から詳しく説明すると、
didSelectedSymbolのif文ですが、これがFALSEのときにその中の処理を行うということにしています。
点をタップしたときに呼ばれるメソッドの順番が、

 - (void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index withEvent:(UIEvent *)event
 ↓
 -(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point

です。
なので、if文がないと
タップされた点を大きくする → 大きくした点を元の大きさに戻す
の流れが一瞬で行われて、点を大きくした意味がなくなります。
なので、点がタップされたぞ!というフラグがたったときは何もしないようにします。

 CPTScatterPlot *plot = (CPTScatterPlot*)[ graphHosting.hostedGraph plotWithIdentifier: あなたが名付けた名前];

上記のコードは、plotWithIndentifier部分で指定したIdentifierと同じCPTScatterPlotを取得することができます。
なので、あらかじめグラフをつくるときに、点を表示させるCPTScatterPlotのインスタンスにidentifierを設定してください。

 sampleSymbolPlot.identifier = @"sample symbol plot";

上記のidentifierを指定した場合、

 CPTScatterPlot *plot = (CPTScatterPlot*)[ graphHosting.hostedGraph plotWithIdentifier: @"sample symbol plot"];

となります。

 selectedIndex_ = NSNotFound;

これでタップされた点のindexはないよ!ということになります。(本当は selectedIndex = 0 とほぼ同じです)

最後に、グラフを再描画することを忘れないでください。

 [plot reloadData];

また、if文の外に

 didSelectedSymbol_ = FALSE;

があるのは、点がタップされてif文を通過したあとにFALSEにしないといつまでもdidSelectedSymbolはTRUEなので、グラフ上の点以外をタップしてもif文の中は通らず、大きくなった点の大きさを元に戻すことができません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です