在CorePlot中标记条形图

时间:2014-11-20 20:23:34

标签: objective-c cocoa core-plot

我有一个使用Coreplot的水平条形图,其中我在条形图中有标签,带有白色文字 像这样

Long Bar

但是,如果要缩短栏以包含标签,我希望文字为黑色而不是像这样偏移。

Short Bar

是否有可以检查标签是否被剪裁或将标签的宽度与条形长度进行比较?到目前为止我有这个

-(CPTTextLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{
    NSNumberFormatter *numberFormatter = [NSNumberFormatter percentFormatter];
    NSDictionary *bar = [self.dataSource objectAtIndex:index];
    NSDecimalNumber *xValue = [bar valueForKey:@"Value"];
    NSString *stringLabel = [numberFormatter stringFromNumber:xValue];

    CPTMutableTextStyle *whiteStyle = [[CPTMutableTextStyle alloc] init];
    whiteStyle.color    = [CPTColor whiteColor];
    whiteStyle.fontSize = CPTFloat(12.0);
    whiteStyle.fontName = @"HelveticaNeue-Medium";

    CPTMutableTextStyle *darkStyle = [[CPTMutableTextStyle alloc] init];
    darkStyle.color    = [CPTColor blackColor];
    darkStyle.fontSize = CPTFloat(12.0);
    darkStyle.fontName = @"HelveticaNeue-Medium";

    CPTTextLayer *textLayer = [[CPTTextLayer alloc] initWithText:stringLabel];

    if (**isLabelClipped**) {
        plot.labelOffset = 2.0f;
        textLayer.textStyle = darkStyle;
    } else {
        plot.labelOffset = -2.0f;
        textLayer.textStyle = whiteStyle;
    }
    return textLayer;
}

修改 正如Eric建议我试图从图块空间中获取屏幕大小,我的想法是我会使用xValue和barsBase之间的差异,所以我添加了以下内容

NSDecimal plotPoint[2];
plotPoint[CPTCoordinateX] = xValue.decimalValue;

NSNumber *barBase = [self numberForPlot:plot
                                     field:CPTBarPlotFieldBarBase
                               recordIndex:index];

plotPoint[CPTCoordinateY] = barBase.decimalValue;
CGPoint dataPoint = [plot.plotSpace plotAreaViewPointForPlotPoint:plotPoint numberOfCoordinates:2];
NSLog(@"Data Point:%@", NSStringFromPoint(dataPoint));

但这会给出像

这样的值
  

{531.46951532736807,57.166666666666664}

barBase值(57 ..)看起来是绘图区域的最左侧,而不是预期的0轴。

1 个答案:

答案 0 :(得分:1)

知道条形长度(来自xValue),您可以使用绘图空间来确定其在屏幕上的大小。创建textLayer后,检查其边界size。比较两者并决定是将标签放在条形图内部还是外部。