我在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,我会得到正确的点但是标注似乎是这样翻转的:
如何获得正确的绘图点坐标以显示标注?
答案 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
的人来说,我希望这会有所帮助。