2012-01-30 134 views
0

我正在使用CorePlot繪製PieChart。我想在切片上顯示切片標籤。有沒有辦法獲得每個切片的座標,然後設置保存文本標籤的CPTLayer的框架以適應切片的座標?iPhone CorePlot餅圖獲取切片座標

我所迄今做:

-(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

+0

你能描述一下你的意思是「每片的座標」嗎? – 2012-01-31 02:19:23

+0

這裏是圖像:https://dl-web.dropbox.com/get/Public/piechart.png?w=611f0ec7 我想知道餅圖中心的座標以及點A和B ,所以我可以將我的標籤放在這3點之間的某處。 – Maggie 2012-01-31 12:47:30

+0

該鏈接沒有公共權限。你能描述A和B在哪裏嗎? – 2012-02-01 03:53:37

回答

3

您是否嘗試過CPPieChart labelOffset屬性設置爲負值?可能它不能提供你需要的精度水平,但它是一個簡單的解決方案。

正偏移:

Positive Offset

負偏移:

enter image description here

+0

thanx,到目前爲止真的有這個技巧:)但是,我仍然想知道是否有任何方法可以獲得切片的座標? – Maggie 2012-01-30 14:51:29

+0

我一直在玩情節和標籤圖層,但無法提供這些信息,可能有人在Core Plot wiki上就能夠回答這個問題。 – elibud 2012-01-30 15:38:26

+0

無論如何,謝謝你 – Maggie 2012-01-30 21:33:53

0

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 source code以查看餅圖如何計算標籤的位置。此代碼說明了「爆炸」的切片,並將標籤放置在所謂的點「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; 
}