【问题标题】:iOS Core Plot: Adjust y axis padding to label sizeiOS Core Plot:将 y 轴填充调整为标签大小
【发布时间】:2012-02-29 15:10:29
【问题描述】:

过去几天我第一次使用 Core Plot。我花了一些时间弄清楚它是如何工作的,但我几乎可以实现我正在寻找的所有功能。但一方面我没有找到解决方案:

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

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

有没有办法根据标签自动调整填充大小?

【问题讨论】:

    标签: ios padding core-plot labels


    【解决方案1】:

    安德烈,

    我意识到这是一个老问题,但也许这对您或其他人来说是一个有用的想法。我想知道您是否可以做得比仅仅猜测所需的填充大小更好。这段代码sn-p怎么样:

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

    无论如何,我没有测试上面的代码,但我认为这个概念应该适用......

    【讨论】:

      【解决方案2】:

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

      当然,这只是一个估计。但最好是固定填充对于小数字来说太大而对于大数字来说太小......

      【讨论】:

        【解决方案3】:

        我首先使用了 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];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 1970-01-01
          • 2017-09-20
          • 1970-01-01
          相关资源
          最近更新 更多