当选择点颠倒时,CorePlot显示标注

时间:2012-09-06 14:10:39

标签: iphone ios graph uikit core-plot

我在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,我会得到正确的标注但是在错误的地方:

Clicked point in yellow

如果我将_view设置为CPTGraphHostingView,我会得到正确的点但是标注似乎是这样翻转的:

enter image description here

如何获得正确的绘图点坐标以显示标注?

2 个答案:

答案 0 :(得分:1)

你不应该在托管视图中添加任何子视图 - 它在iOS上使用翻转变换,因此Core Plot可以在iOS和Mac之间共享绘图代码。

使用-convertPoint:toView:-convertPoint:fromView:方法将touchedPoint从主机视图的坐标系转换为ViewController.view坐标系。

答案 1 :(得分:0)

我已将CPTGraphHostingView子类化为一些图表,因此我发现您添加的任何子视图都可以执行以下操作:

subview.transform = CGAffineTransform(1.0, -1.0)

这并没有改变坐标系是(0,0)-bottom-left的事实,但你添加的UIView将在渲染时以正确的方式向上绘制。仍然使用Eric's Answer来进行坐标系之间的转换,但对于那些发现自己试图将子视图添加到CPTGraphHostingView的人来说,我希望这会有所帮助。