我是CorePlot库的新手。在我们的一个应用程序中,我们使用CorePlot绘制图表的条形图。
我们还为图表中的每个条形图显示数据标签。
我正在使用labelOffset
在条形图中设置其位置(即labelOffset= -10.0
)
但是,当图表中的某个条形图太小而无法容纳条形图中的数据标签时,我会设置labelOffset = 10.0
,以便它可以显示在条形图上方作为默认值。
但是,我在CPTPlot中看到了这种奇怪的行为,其中它在条形图上绘制了两次数据标签。这是一个截图:
这是一个代码snipet:
-(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
检查特定于情节的y值,然后相应地返回data {labelOffset
和textStyle
的dataLabel。但是,我现在在条形图上看到以下行为:
我在想,dataLabelForPlot:recordIndex:
是否使用CPTTextLayer
的相同实例?有没有办法可以为每个不同的CPTTextLayer
?
CPTBarPlot
个实例
由于