2011-09-11 5 views
3

私は、可変数のCGMutablePathRefを作成するためにループを使用して、サークル上の可変数のウェッジを描画しようとしています。何らかの理由で、私のループの最後に、私の配列は1つのオブジェクトだけを返します。iPhone用のCGMutablePathRefの配列を作成していますか?

+ (NSMutableArray *)pathForCircleWithRect:(CGRect)rect numOfWedges:(NSUInteger)num 
{ 
CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); 
CGFloat radius = rect.size.width/2; 
CGFloat angle = RADIANS(360)/num; 

CGFloat startAngle = 0; 
CGFloat endAngle = startAngle + angle; 

NSMutableArray *paths = [NSMutableArray array]; 

for (int x = 0; x < num; x++); 
{ 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, center.x, center.y); 
    CGPathAddArc(path, NULL, center.x, center.y, radius, startAngle, endAngle, 0); 
    CGPathAddLineToPoint(path, NULL, center.x, center.y); 

    [paths addObject:(id)path]; 
    startAngle = endAngle; 
    endAngle = startAngle + angle; 
} 

return paths; 
} 

編集 UIBezierPathのを使用して新しい試み:

+ (NSMutableArray *)pathForCircleWithRect:(CGRect)rect numOfWedges:(NSUInteger)num 
{ 
CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); 
CGFloat radius = rect.size.width/2; 
CGFloat angle = RADIANS(360)/num; 

CGFloat startAngle = 0; 
CGFloat endAngle = startAngle + angle; 

NSMutableArray *paths = [NSMutableArray array]; 

for (int x = 0; x < num; x++); 
{ 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, center.x, center.y); 
    CGPathAddArc(path, NULL, center.x, center.y, radius, startAngle, endAngle, 0); 
    CGPathAddLineToPoint(path, NULL, center.x, center.y); 

    [paths addObject:[UIBezierPath bezierPathWithCGPath:path]]; 
    startAngle = endAngle; 
    endAngle = startAngle + angle; 
} 

return paths; 
} 

この関数を呼び出すコード:

- (void)drawRect:(CGRect)rect 
{ 
int num = 18; 
NSMutableArray *paths = [WheelView pathForCircleWithRect:rect numOfWedges:num]; 
NSMutableArray *colors = [WheelView colorsForCircleWithNumOfWedges:num]; 
CGContextRef context = UIGraphicsGetCurrentContext(); 

for (int x = 0; x < num; x++) 
{ 
    CGContextSetFillColorWithColor(context, (CGColorRef)[colors objectAtIndex:x]); 
    CGContextSaveGState(context); 
    CGMutablePathRef wedgePath = (CGMutablePathRef)[paths objectAtIndex:x]; 
    CGContextAddPath(context, wedgePath); 
    CGContextDrawPath(context, kCGPathFill); 
    //CGContextClip(context); 
    CGContextRestoreGState(context); 
} 
} 
+2

2つのコメント:1)パスが漏れています。あなたはそれらを作成してから、それらを配列に追加してから解放しません。 2)CGPathRefはObjective-Cオブジェクトとフリーダイヤルでブリッジされていません。 CFTypeRefsで使用される基本クラスが '-retain'を' CFRetain() 'に変換するので、実際にはうまくいく可能性がありますが、厳密に言えば、そうしてはいけません。 'CFPathRef'を' UIBezierPath * 'オブジェクトで囲むべきです。 –

+0

実際に 'numOfWedges:'> 1でメソッドを呼び出しますか? – DarkDust

+0

うん、私は18でそれを入力しています。私はxが実際に18に達することを確認するためにループにブレークポイントを挿入しました。返されるオブジェクトは最初のパスだけです。 – Chiubaka

答えて

1

ここで私は、アレイを構築するために使用している方法がありますこれに対する答えはメモリリークよりはるかに簡単でしたが、メモリリークが間違いなく問題を引き起こしていました。 for行の最後に誤ってセミコロンを置いたので、私のコードは実行されませんでした。したがって、forループは実行されませんでした。

+2

:) ドイツ語では、 「すべての木のために森林が見えません」 –

+0

ロギングにも役立ちます:) – alex

関連する問題