Круговая диаграмма iPhone CorePlot получить координаты срезов - PullRequest
0 голосов
/ 30 января 2012

Я использую CorePlot для рисования PieChart.Я хотел бы отображать метки для ломтиков на самих ломтиках.Есть ли способ получить координаты каждого среза, а затем установить фрейм CPTLayer, который содержит текстовую метку, чтобы приспособиться к координатам среза?

Что я делаю до сих пор:

-(CPRLayer*) datLabelForPlot(CPTPlot*)plot recordIndex:(NSUInteger)index {
  static CPTMutableTextStyle *textStyle = nil;
  NSString *string = @"Test";

    if ( !textStyle) {
        textStyle= [[CPTMutableTextStyle alloc] init];
        textStyle.color = [CPTColor whiteColor];
    }
    CPTLayer *layer = [[[CPTLayer alloc] initWithFrame:CGRectMake(50,50, 100, 20)]autorelease];
    CPTTextLayer *newLayer = nil;
    newLayer = [[[CPTTextLayer alloc] initWithText:string style:textStyle] autorelease];
    [layer addSublayer:newLayer];
    return layer;
}

, но независимо от рамки слоя, метка всегда отображается в одной и той же позиции (вне графика).Как установить соответствующий слой слоя для отображения текста на самом срезе?

Вот изображение точек, которые я хотел бы знать: piechart

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Вы пытались установить для свойства CPPieChart labelOffset отрицательное значение?Может быть, это не обеспечивает требуемый уровень точности, но это простое решение.

Положительное смещение:

Positive Offset

Отрицательное смещение:

enter image description here

0 голосов
/ 02 февраля 2012

centerAnchor выражается в виде доли от размера области графика, поэтому вы можете использовать следующий код для вычисления его положения в пикселях (точка «O» на изображении):

CPTPieChart *pieChart; // the pie chart
CGRect plotAreaBounds = pieChart.plotArea.bounds;
CGPoint anchor = pieChart.centerAnchor;
CGPoint centerPoint = CGPointMake(plotAreaBounds.origin.x + plotAreaBounds.size.width * anchor.x,
                                  plotAreaBounds.origin.y + plotAreaBounds.size.height * anchor.y);

Вы можете посмотреть исходный код Core Plot , чтобы увидеть, как круговая диаграмма вычисляет положение меток.Этот код учитывает фрагменты, которые «взорвались», и центрирует метку между так называемыми точками «A» и «B», смещенными на labelOffset.Он скрывает метку, если источник данных возвратил пропущенное значение (NAN) для среза.index соответствует индексу источника данных круговой секции.Соответствующие биты:

double currentWidth = [self cachedDoubleForField:CPTPieChartFieldSliceWidthNormalized recordIndex:index];
if ( isnan(currentWidth) ) {
    contentLayer.hidden = YES;
}
else {
    id<CPTPieChartDataSource> theDataSource = id<CPTPieChartDataSource>)self.dataSource;
    BOOL dataSourceProvidesRadialOffsets = [theDataSource respondsToSelector:@selector(radialOffsetForPieChart:recordIndex:)];
    CGFloat radialOffset = 0.0;
    if ( dataSourceProvidesRadialOffsets ) {
        radialOffset = [theDataSource radialOffsetForPieChart:self recordIndex:index];
    }

    CGFloat labelRadius = self.pieRadius + self.labelOffset + radialOffset;

    double startingWidth = 0.0;
    if ( index > 0 ) {
        startingWidth = [self cachedDoubleForField:CPTPieChartFieldSliceWidthSum recordIndex:index - 1];
    }
    CGFloat labelAngle = [self radiansForPieSliceValue:startingWidth + currentWidth / (CGFloat)2.0];

    label.displacement = CGPointMake( labelRadius * cos(labelAngle), labelRadius * sin(labelAngle) );
    contentLayer.hidden = NO;
}
...