2012-02-29 8 views
2

Core Plotを初めて使用するために最後の数日を費やしました。それはどのように動作するか私はいくつかの図をいくつか持っていたが、私が探していたほとんどすべての機能を実現することができた。しかし、私は解決策を見つけられませんでした.1つは、iOS Core Plot:y軸のパディングをラベルサイズに調整する

私は両方の軸にラベルを付けたXYプロットを使用しています。 plotAreaFrameには、左に余白があり、plotAreaを右に移動し、y軸のラベルに空き領域を作成します。ラベルが大きくない限り、これは問題なく動作します。値は100までです。しかし、yの値が大きくなると、たとえば、次のようになります。 10.0000、完全なラベルを表示するには、パディングでは不十分です。

もちろん、私はより高いパディングを使用することができますが、これはy値が小さい場合にはスペースを無駄にします。

ラベルに従って埋め込みを自動化する方法はありますか?

答えて

2

ここで答えが得られなかったので、私はウェブ全体を見渡したが、そこには答えが見つからなかった。ここで私がうまくいくのは、Y軸の現在の範囲を確認し、値の桁数を調べ、必要な幅を手動で計算することです。

もちろんこれは推定に過ぎません。しかし、私は、これは古い質問ですが、おそらくこれはあなたに役に立つと考えられている実感

5

アンドレイ、

...固定パディングウィッヒは小さな数字には大きすぎると、多数のためには小さすぎる方が良いですまたは他のもの。あなたが必要とするパディングサイズを推測するよりも少し上手くやることができるのだろうかと思います。どのようにこのコードスニペットについて:

// set up the Y axis 
float minY = 0; 
float maxY = 100;  // just some max value 
float tickLength = 10; // just a pleasing value 
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(minY) length:CPTDecimalFromFloat(maxY)]; 

// set up the line style for y axis 
CPTMutableLineStyle * lineStyle = [CPTLineStyle lineStyle]; 
lineStyle.lineColor = [CPTColor blackColor]; 
lineStyle.lineWidth = 2.0f; // just picked a pleasing value 

// set up the y axis 
axisSet = [[CPTXYAxisSet alloc]init]; 
axisSet.yAxis.majorTickLength = tickLength; 

// Now you can determine the size of the rectangle needed to display axis and labels by getting 
// the axis font and measureing how many pixels were needed to draw the maximum Y axis label. 

UIFont * font = [UIFont fontWithName:axisSet.yAxis.labelTextStyle.fontName size:axisSet.yAxis.labelTextStyle.fontSize]; 
NSString * maxYLabel = [axisSet.xAxis.labelFormatter stringFromNumber:[NSNumber numberWithDouble:plotSpace.yRange.maxLimitDouble] ]; 
CGSize textSize = [maxYLabel sizeWithFont:font]; 

// The offset you are looking for can now be computed by: 
textSize.width + axisSet.yAxis.majorTickLength + axisSet.yAxis.labelOffset; 

とにかく、私は上記のコードをテストしていないが、コンセプトは、私が思うに適用すべきである...

1

私が最初にYohstによって提案されたソリューションを使用しました。しかし、次に、最大値範囲の数値が大きいほど、たとえばY値が時間である場合(例えば、screenshotのように)ラベルが大きくならないことがあることに気付きました。

だから私は、ラベルの最大幅を見つけるために、グラフの左パディングとして設定する軸のラベルを反復処理:

CPTXYAxisSet *axisSet = (CPTXYAxisSet *)_graph.axisSet; 
CPTXYAxis *yAxis = axisSet.yAxis; 
[yAxis relabel]; 
CGFloat maxLabelWidth = 0; 
for (CPTAxisLabel *label in yAxis.axisLabels) { 
    maxLabelWidth = MAX(maxLabelWidth, label.contentLayer.bounds.size.width); 
} 
_graph.plotAreaFrame.paddingLeft = /* extra padding + */ maxLabelWidth; 
// force update axes because of the new padding 
[axisSet relabelAxes]; 
[axisSet setNeedsLayout]; 
関連する問題