達成したいこと
Core Plot(1.1)を使用して棒グラフを描画しています。ユーザーが選択(タップ)した棒の下に、ポップオーバーの詳細を表示したいと思います。
コード
私のコードは次のようになります。
- (void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx {
NSNumber *yValue = self.values[idx];
NSLog(@"barWasSelectedAtRecordIndex x: %i, y: %@",idx,yValue);
NSDecimal plotPoint[2];
NSNumber *plotXvalue = [self numberForPlot:plot
field:CPTScatterPlotFieldX
recordIndex:idx];
plotPoint[CPTCoordinateX] =
CPTDecimalFromFloat(plotXvalue.floatValue);
NSNumber *plotYvalue = [self numberForPlot:plot
field:CPTScatterPlotFieldY
recordIndex:idx];
plotPoint[CPTCoordinateY] =
CPTDecimalFromFloat(plotYvalue.floatValue);
CPTXYPlotSpace *plotSpace =
(CPTXYPlotSpace *)graph.defaultPlotSpace;
CGPoint dataPoint =
[plotSpace plotAreaViewPointForPlotPoint:plotPoint];
NSLog(@"datapoint (CGPoint) coordinates tapped: %@",
NSStringFromCGPoint(dataPoint));
GrowthChartInfoTableViewController *infoViewController =
[self.storyboard instantiateViewControllerWithIdentifier:
@"GrowthChartInfo"];
self.popover = [[UIPopoverController alloc]
initWithContentViewController:infoViewController];
self.popover.popoverContentSize = CGSizeMake(320, 300);
self.popover.delegate = self;
CGRect popoverAnchor =
CGRectMake(dataPoint.x + graph.paddingLeft,
dataPoint.y - graph.paddingTop + graph.paddingBottom,
(CGFloat)1.0f, (CGFloat)1.0f);
[self.popover presentPopoverFromRect:popoverAnchor
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
私の問題
ポップオーバービューコントローラーのy位置が正しくありません。これはバーごとに異なり、y値が負の最初のバーでは、下限ではなく上限で表示され、バーが非表示になります。 。x位置は正しいようです。
助けてください
私のコードが期待どおりに機能しない理由について何かアイデアはありますか?
ありがとうございました!
編集
エリックの回答に基づいて、コードを次のように更新しました。
- (void)barPlot:(CPTBarPlot *)plot barWasSelectedAtRecordIndex:(NSUInteger)idx {
NSNumber *plotXvalue = [self numberForPlot:plot
field:CPTScatterPlotFieldX
recordIndex:idx];
NSNumber *plotYvalue = [self numberForPlot:plot
field:CPTScatterPlotFieldY
recordIndex:idx];
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
CGPoint cgPlotPoint =
CGPointMake(plotXvalue.floatValue,
plotYvalue.floatValue);
CGPoint cgPlotAreaPoint =
[graph convertPoint:cgPlotPoint toLayer:graph.plotAreaFrame.plotArea];
NSDecimal plotAreaPoint[2];
plotAreaPoint[CPTCoordinateX] =
CPTDecimalFromFloat(cgPlotAreaPoint.x);
plotAreaPoint[CPTCoordinateY] =
CPTDecimalFromFloat(cgPlotAreaPoint.y);
CGPoint dataPoint = [plotSpace
plotAreaViewPointForPlotPoint:plotAreaPoint];
NSLog(@"datapoint (CGPoint) coordinates tapped: %@",NSStringFromCGPoint(dataPoint));
GrowthChartInfoTableViewController *infoViewController = [self.storyboard
instantiateViewControllerWithIdentifier:@"GrowthChartInfo"];
self.popover = nil;
self.popover = [[UIPopoverController alloc]
initWithContentViewController:infoViewController];
self.popover.popoverContentSize = CGSizeMake(250, 200);
self.popover.delegate = self;
CGRect popoverAnchor =
CGRectMake(dataPoint.x + graph.paddingLeft,
dataPoint.y - graph.paddingTop + graph.paddingBottom,
(CGFloat)1.0f, (CGFloat)1.0f);
[self.popover presentPopoverFromRect:popoverAnchor
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionUp
animated:YES];
}
しかし、私が得ている結果は以前よりも間違っています。私は何かを誤解しているに違いないと思います。NSLogコマンドの結果の一部を次に示します。
barWasSelectedAtRecordIndex x: 0, y: -0.03920931548773198848
datapoint (CGPoint) coordinates tapped: {-6388.88, -67024.8}
barWasSelectedAtRecordIndex x: 2, y: 0.174494288286651392
datapoint (CGPoint) coordinates tapped: {-6073.38, -66790}
barWasSelectedAtRecordIndex x: 2, y: 0.174494288286651392
datapoint (CGPoint) coordinates tapped: {-6073.38, -66790}
barWasSelectedAtRecordIndex x: 0, y: -0.03920931548773198848
datapoint (CGPoint) coordinates tapped: {-6388.88, -67024.8}
私のコードでは、バー座標からビュー座標への変換が完全に間違っているようです。
編集2
コードサンプルをありがとう、エリック!
コードを更新し、次のオプションでテストしました(y-value = 0:plotPoint[CPTCoordinateY] = CPTDecimalFromFloat(0.0f)
、y値が正しくないように見えるポップオーバーのアンカーポイントになります(次のスクリーンショットを参照してください)。アンカーポイントのy -値は0
、y軸上のの位置と同等である必要があります。
次に、アンカーポイントのy値をデータの現在のy値に設定しようとしました。(plotPoint[CPTCoordinateY] = plotYvalue.decimalValue
)。これにより、バーの上部ではなく、y軸の0値に近いアンカーポイントが作成されます。ただし、y値は会社ごとに少し変化し(x値)、y値のシフトに問題がある可能性があることを示しています。
エリックが提案した追加の変換も試しましたdataPoint = [self.view convertPoint:dataPoint fromView:graph.hostingView]
が、結果は変わりませんでした。さらに- graph.paddingTop + graph.paddingBottom
、最終的なy値に追加しようとしましたが、成功しませんでした。
私のエラーが何であるかについてのアイデアをいただければ幸いです。
ありがとうございました!