我对 CorePlot 库还很陌生。在我们的一个应用程序中,我们使用 CorePlot 绘制图表的条形图。我们还为图表中的每个条形图显示数据标签。我labelOffset
用来设置它在条形图中的位置(即labelOffset= -10.0
)但是,当图表中的一个条形图太小而无法容纳条形内的数据标签时,我正在设置labelOffset = 10.0
,以便它可以出现在上方该栏默认。
但是,我在 CPTPlot 上看到了这种奇怪的行为,其中它在条形图上绘制了两次数据标签。这是一个屏幕截图:
这是一个代码片段:
-(CPTTextLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{
plot.labelFormatter = nil;
plot. labelTextStyle = nil;
if (self.showValuesAsPlotLabels)
{
if (self.showValuesAsPlotLabels)
{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setGeneratesDecimalNumbers:NO];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
CGFloat yValue = [self.chartData[index][1] floatValue];
//return [NSString stringWithFormat:@"%f", yValue];
NSString *labelStr = [numberFormatter stringFromNumber:@(yValue)];
/* Check to see how tall is bar chart so that we can accordingly position data label */
CGFloat yBaseOffsetValue = self.yAxisIntervalLength;
CGFloat compareValue = (yBaseOffsetValue * self.divisor);
UIColor *dataLabelColor;
float dataLabelOffset = -10.0f;
if (yValue > compareValue) {
dataLabelColor = [UIColor whiteColor];
plot.labelOffset = dataLabelOffset;
} else {
dataLabelColor = [UIColor blackColor];
plot.labelOffset = (0.0f - dataLabelOffset);
}
return [[CPTTextLayer alloc] initWithText:labelStr style:[CPTTextStyle textStyleWithAttributes:@{NSForegroundColorAttributeName: dataLabelColor}]];
}
if (self.plotLabels == nil || self.plotLabels.count < index)
{
return nil;
}
NSString *identifier = (self.plotLabels)[index];
CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:identifier];
return label;
}
我在这里错过了什么或做错了什么?
提前致谢。
编辑
在 Eric 的建议之后,我尝试使用plot.identifier
来检查特定的 yValues,然后相应地返回labelOffset
和textStyle
dataLabel。但是,我现在在条形图上看到以下行为:
我在想,dataLabelForPlot:recordIndex:
是不是在使用相同的实例CPTTextLayer
?有没有一种方法可以CPTTextLayer
让每个不同的实例都有单独的实例CPTBarPlot
?
谢谢