1

コールアウト バブルを表示するために、CPTScatterPlotDelegate に次のコードを実装しました。

-(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index
{
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)plot.plotSpace;
    CPTGraph *graph = plot.graph;
    int yIdent = ((NSString*)plot.identifier).intValue;

    NSNumber *yVal = [[_dataRange yForIndex:index] objectAtIndex:yIdent-1];
    NSNumber *xVal = [_dataRange xForIndex:index];
    double doublePrecisionPlotPoint[2];//[x,y]
    doublePrecisionPlotPoint[0] = xVal.doubleValue;
    doublePrecisionPlotPoint[1] = yVal.doubleValue;
    CGPoint touchedPoint = [graph.defaultPlotSpace plotAreaViewPointForDoublePrecisionPlotPoint:doublePrecisionPlotPoint];

    if(_annotation)
        [_annotation dismissCalloutAnimated:YES];
    _annotation = [[SMCalloutView alloc] init];
    //todo appropriate units
    _annotation.title = [NSString stringWithFormat:@"%.2f kg", yVal.doubleValue];
    [_annotation presentCalloutFromRect:CGRectMake(touchedPoint.x, touchedPoint.y, 1, 1) inView:_view constrainedToView:_view permittedArrowDirections:SMCalloutArrowDirectionAny animated:YES];
}

_dataRange はデータを保持する単なるカスタム クラスであり、_annotation はコールアウトのインスタンスです。

問題は、吹き出しの位置が正しく機能しないことです。_view を ViewController.view に設定すると、適切なコールアウトが得られますが、次のように間違った場所に配置されます。

黄色のクリックポイント

代わりに _view を CPTGraphHostingView に設定すると、正しいポイントが得られますが、吹き出しは次のように反転しているように見えます。

ここに画像の説明を入力

吹き出しを表示するための正しいプロット ポイント座標を取得するにはどうすればよいですか?

4

2 に答える 2

1

ホスティング ビューにサブビューを追加しないでください。iOS では反転変換が使用されるため、Core Plot は iOS と Mac の間で描画コードを共有できます。

-convertPoint:toView:または-convertPoint:fromView:メソッドを使用して、ホスト ビューの座標系から座標系に変換しtouchedPointますViewController.view

于 2012-09-06T22:34:28.930 に答える
0

いくつかのチャートをサブクラス化CPTGraphHostingViewしたので、別の方法として、追加するサブビューを見つけたので、次のことを行う必要があります。

subview.transform = CGAffineTransform(1.0, -1.0)

これは、座標系が (0,0)-bottom-left であるという事実を変更しませんが、追加した UIView はレンダリング時に右方向に描画されます。座標系間の変換には引き続きEric's Answerを使用しますが、ここでサブビューを追加しようとしている人にとっては、CPTGraphHostingViewこれが役立つことを願っています。

于 2014-05-08T03:50:06.847 に答える