4

私はiPhoneプログラミングの初心者です。図 1 のような円を作成する必要があります。この円は、4 つの異なるレベルを持つ 6 つの異なる部分に分割する必要があります (図 1 を参照)。さらに、図 2 に示すように、特定のデータに従って円を作成する必要があります。各部分をクリックして、特定の部分をズームできる必要があります (図 3 を参照)。

ここに画像の説明を入力
図 1: 6 つの異なる色を示しています。そのうちの 2 つが 1 つに分割され、残りの 4 つが 3 つの部分に分割されています。
ここに画像の説明を入力
図 2:さまざまなレベルのさまざまなカテゴリの結果を示しています。
ここに画像の説明を入力
図 3:選択したカテゴリのズーム ビジョンです。

カスタムUIViewをロードし、drawRectメソッドを使用して円を描画するストーリーボードがあります。

問題は、数字のような円グラフを作成する方法です。

私は多くのことを試しましたが、いくつかのガイドを使用できます-または、この例を挙げてください.
ありがとう

4

4 に答える 4

4

Quartz 2D Programming Guide、特にEllipsesClipping to Pathsセクションを見てください。残りは、基本的な数学と幾何学です。

UIView をサブクラス化し、Quartz 2D フレームワークを使用して円を描画し、おそらくtouchesBegan:およびtouchesEnded:メソッドを実装して円のタップを処理します。

于 2012-07-01T12:10:17.943 に答える
1

何らかの方法で変更をアニメーション化する場合(最後の画像のカテゴリを拡大する場合など)は、できるだけ多くのCoreAnimationを使用するようにしてください。

CoreAnimationを使用してカスタムのアニメーション化可能な円グラフを作成するためのこのすばらしいチュートリアルをご覧ください。あなたが望むものを得るためにそれを修正することができると確信しています。

また、アニメーションを気にせず、状態から状態へとジャンプする円だけを表示しても問題がない場合、Core Animationはおそらく物事を過度に複雑にし、Core Graphicsのようなもの(他の回答のように)はおそらく正しい方法ですトーゴ。

于 2012-07-15T11:33:12.620 に答える
1

円グラフの例:

int sum = 0;
CGFloat offset;
CGFloat angleArray[numberOfSections+1];

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetAllowsAntialiasing(context, true);
CGContextSetShouldAntialias(context, true);

for(int i=0; i<numberOfSections; i++) {
    sum += angle;
}

for(int i=0; i<numberOfSections; i++) {
    angleArray[i] = (float)((angle)/(float)sum)*(2*M_PI); 
    CGContextMoveToPoint(context, radius, radius);

    if(i == 0) {
        CGContextAddArc(context, radius, radius, radius, 0, angleArray[i], 0);
    } else {
        CGContextAddArc(context, radius, radius, radius, offset, (offset+angleArray[i]), 0);
    }
    offset += angleArray[i];

    CGContextSetFillColorWithColor(context, ((UIColor *)[hjulColorArray objectAtIndex:i]).CGColor);
    CGContextClosePath(context); 
    CGContextFillPath(context);
}
于 2012-07-27T14:59:19.253 に答える
0

実際、この改訂された回答は、長期的にはより役立つと思います。これらのドキュメントを見てください。

CGPathAddLineToPoint    
CGPathAddArc

これは、基本的にあなたがやろうとしていることとまったく同じです。

于 2012-07-01T14:04:47.223 に答える