iOS Core图:调整y轴填充以标记大小

问题描述:

我已经花了最近几天首次使用Core Plot。我花了一些时间弄清楚它是如何工作的,但我几乎可以认识到我正在寻找的所有功能。但有一件事我没有找到解决办法:iOS Core图:调整y轴填充以标记大小

我在两个轴上都使用了带有标签的XY图。 plotAreaFrame有一个左填充符将plotArea移到右侧,并为y轴标签创建一些空闲空间。只要标签不是很大,例如,这可以很好地工作。对于高达100的值。但是如果y值变大,例如。 10.0000,填充不足以显示完整的标签。

当然,我可以使用更高的填充,但如果我只有小的y值,这会浪费空间。

有什么办法根据标签自动填充填充?

在这里没有回答之后,我浏览了整个网页,但是没有找到答案。现在对我而言,这个解决方案只是检查Y轴的当前范围,查看该值有多少位数并手动计算必要的宽度:number_of_digits * width_per_digit + fixed_pa​​dding

当然,这只是一个估计。但最好是一个固定填充至极太大了,小的数字和太小了大量...

安德烈,

我意识到这是一个老问题,但也许这是一个有用的想法给你或其他人。我想知道你是否能做得更好,而不仅仅是猜测你需要的填充大小。这个怎么样代码片段:

// 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; 

反正我没有测试上面的代码,但这个概念应适用我想......

我第一次使用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];