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_padding
当然,这只是一个估计。但最好是一个固定填充至极太大了,小的数字和太小了大量...
答
安德烈,
我意识到这是一个老问题,但也许这是一个有用的想法给你或其他人。我想知道你是否能做得更好,而不仅仅是猜测你需要的填充大小。这个怎么样代码片段:
// 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];