我花了最近几天才第一次使用Core Plot。我花了一些时间弄清楚它是如何工作的,但我几乎可以实现我所寻找的所有功能。但有一点我找不到解决方案:
我正在使用两个轴上带有标签的XY图。 plotAreaFrame有一个左边的填充,可以将plotArea向右移动,并为y轴标签创建一些空闲空间。只要标签不大,例如,这种方法就可以正常工作。对于最多100的值。但是如果y值变大,例如。 10.0000,填充不足以显示完整的标签。
当然我可以使用更高的填充,但如果我的y值很小,这会浪费空间。
有没有办法根据标签自动调整填充?
答案 0 :(得分: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 :(得分:2)
在这里没有回答之后我在网上看了一遍,但也没有回答。现在适用于我的解决方案只是检查Y轴的当前范围,查看该值的位数并手动计算所需的宽度:number_of_digits * width_per_digit + fixed_padding
当然这只是一个估计。但是对于小数字而言固定填充最好太大而对于大数目而言太小则更好......
答案 2 :(得分: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];