2012-02-29 2 views
2

코어 플롯을 처음 사용하는 데 지난 며칠을 보냈습니다. 그것이 작동하는 방법을 이해하는 데는 다소 시간이 걸렸지 만, 내가 찾던 거의 모든 기능을 실현할 수있었습니다. 그러나 한 가지 해결책을 찾지 못했습니다.iOS 코어 플롯 : y 축 패딩을 라벨 크기로 조정

두 축에 레이블이있는 XY 플롯을 사용하고 있습니다. plotAreaFrame에는 plotArea를 오른쪽으로 이동하고 y 축 레이블에 사용 가능한 여유 공간을 만들기위한 왼쪽 패딩이 있습니다. 라벨이 크지 않은 한 제대로 작동합니다 (예 : 값은 100까지입니다. 그러나 y 값이 커지면, 예를 들어. 10.0000, 패딩은 전체 레이블을 표시하기에 충분하지 않습니다.

물론 나는 더 높은 패딩을 사용할 수 있지만, y 값이 작 으면 공간을 낭비 할 것입니다.

레이블에 따라 패딩을 자동 크기화할 수있는 방법이 있습니까?

답변

2

여기에 아무런 답변이 없으면 웹에서 보았지만 대답이 없습니다. 이제 나를 위해 작동하는 솔루션은 Y 축의 현재 범위를 확인하고 값의 자리수를 확인한 다음 수동으로 필요한 너비를 계산하는 것입니다. number_of_digits * width_per_digit + fixed_padding

물론 이것은 단지 예측에 불과합니다. 그러나 나는이 오래된 질문이다 그러나 아마이 당신에게 유용한 생각을 실감

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]; 
:

그래서 나는 레이블의 최대 너비를 찾기 위해 그래프의 왼쪽 패딩으로 설정하는 축 레이블을 통해 반복