1

Core-plot を使用して iOS でドーナツ円グラフを描画しようとしています。各スライスの幅は同じですが、スライスは色分けされています。各スライスの中央に色付きのドットを配置しようとしていますが、ドットの位置を正しくする方法がわかりません。

円グラフの labelOffset プロパティを使用して、それらをほぼ中央に配置することができました (現在、試行錯誤によって決定された -35 のラベル オフセットを使用しています)。しかし、それらを正確に中央に配置することはできず、最も内側のグラフでは、間違ったスライスに入るほど離れてしまう可能性があります。テキストレイヤーのrectAnchorプロパティとパディングを設定しようとしましたが、どちらも効果がないようです。

プロットを作成するためのコード:

   CGFloat startAngle = [self degreesToRadians:90 + ((360 / [self.dangerRoseData numberOfSectors]) /2.0)];

    NSInteger levels = [self.dangerRoseData numberOfLevels];
    for(int i = 0; i < levels; i++){
        CGFloat radiusD =  (i + 1.0)/ levels;
        CGFloat radius =  MIN(radiusD * (graphHostingView.frame.size.height - 2 * graph.paddingLeft) / 2.8,
                              radiusD * (graphHostingView.frame.size.width - 2 * graph.paddingTop) / 2.8);

        CPTPieChart *lastPie = [plots lastObject];
        CGFloat innerRadius;
        if(lastPie != nil)
            innerRadius = lastPie.pieRadius;
        else
            innerRadius = 0;

        CPTPieChart *piePlot = [[CPTPieChart alloc] init];
        piePlot.backgroundColor = [UIColor clearColor].CGColor;
        piePlot.dataSource = self;
        piePlot.delegate = self;
        piePlot.pieRadius  = radius;
        piePlot.pieInnerRadius  = innerRadius;
        piePlot.identifier      = [self.dangerRoseData nameForLevel:i];
        piePlot.borderLineStyle = lineStyle;
        piePlot.startAngle      = startAngle;
        piePlot.sliceDirection  = CPTPieDirectionClockwise;
        piePlot.labelOffset = -35;//brute force trial and error
        piePlot.labelRotationRelativeToRadius = NO;//new property after 1.0

        [graph addPlot:piePlot];
        [plots addObject:piePlot];
    }

ラベルの場合:

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index{
....

CPTMutableTextStyle *textStyle = [[CPTMutableTextStyle alloc] init];
textStyle.color = color;
textStyle.fontSize = 36;
CPTTextLayer *label = [[CPTTextLayer alloc] initWithText:@"•" style:textStyle];
return label;
}

CPTPiePlot labelRotationRelativeToRadius に新しいプロパティを追加する core-plot の最新バージョンに更新しようとしましたが、これはこの問題に対する答えであるように思われますが、そうではありません。新しいバージョンでは、ドットを正しい場所の近くに配置することができません。

ラベルの配置に何か欠けていますか?

スライスにドットを配置するために完全に間違ったアプローチを使用していますか?

4

1 に答える 1

0

さて、テキスト ラベルの代わりに画像を使ってみることにしました。ポジショニングは問題なく機能し、テキスト ラベルのように不安定になることはまったくないようです。最も内側のパイにドットを収めるためには、サイズも変更する必要がありました。そのため、合計半径を同じ量だけ占有する代わりに、内側のパイは残りの 2 倍のスペースを占有します。プロットを生成するためのコード:

NSInteger levels = [self.dangerRoseData numberOfLevels];
    for(int i = 0; i < levels; i++){
        CPTPieChart *lastPie = [plots lastObject];
        CGFloat innerRadius;
        if(lastPie != nil)
            innerRadius = lastPie.pieRadius;
        else
            innerRadius = 0;

        CGFloat ringThickness;
        ringThickness = ( (graphHostingView.frame.size.width - 2 * graph.paddingTop) / ((levels + 1) * 2) ) * .85;
        if(i == 0)//make the inner circle twice the thickness of the rings
            ringThickness += ringThickness;

        CGFloat radius =  innerRadius + ringThickness;

        int labelOffset = -14;
        if(i == 0)
            labelOffset = -15;

        CPTPieChart *piePlot = [[CPTPieChart alloc] init];
        piePlot.backgroundColor = [UIColor clearColor].CGColor;
        piePlot.dataSource = self;
        piePlot.delegate = self;
        piePlot.pieRadius  = radius;
        piePlot.pieInnerRadius  = innerRadius;
        piePlot.identifier      = [self.dangerRoseData nameForLevel:i];
        piePlot.borderLineStyle = lineStyle;
        piePlot.startAngle      = startAngle;
        piePlot.sliceDirection  = CPTPieDirectionClockwise;
        piePlot.labelOffset = labelOffset;

        [graph addPlot:piePlot];
        [plots addObject:piePlot];
    }

ラベルの場合:

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index
{
   ...

    CPTImageLayer *layer = [[CPTImageLayer alloc] initWithImage:[UIImage imageNamed:filename]];
    layer.anchorPoint = CGPointMake(0.5, 0.5);
    return layer;
}

CPTImageLayer は、画像の使用の複雑さを軽減するための標準的なコア プロットへの追加であることに注意してください。

于 2012-06-27T14:12:35.740 に答える