0

ビュー内にこの-drawRectメソッドがあります:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    GraphPoint* point = [points objectAtIndex:i];
    [point.color setFill];
    [[UIColor blackColor] setStroke];
    CGContextBeginPath(context);
    CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
    CGContextFillPath(context);
    CGContextStrokePath(context);
    UIGraphicsPopContext();
}

[points count]が 1 に等しい場合、すべてが驚くほど機能しますが、増加すると、このエラーがスローされます。

Error>: CGContextSetStrokeColorWithColor: invalid context 0x0.

ループに何か問題があると思います - コンテキストの色を 2 回以上設定します。それを避ける方法がわからない。各ポイントには独自の色が必要で、ループの前にコンテキストの塗りつぶしの色を設定できません。

助けてください!たぶん、誰かがこの問題に直面したことがありますか?

4

2 に答える 2

3

UIGraphicsPopContext の機能を誤解しています。コンテキストに設定されている現在のパスをクリアしようとしていると思います。あなたが欲しいCGContextSaveGStateCGContextRestoreGState

これを試して:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    CGContextSaveGState(context);
    {
        GraphPoint* point = [points objectAtIndex:i];
        [point.color setFill];
        [[UIColor blackColor] setStroke];
        CGContextBeginPath(context);
        CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
        CGContextFillPath(context);
        CGContextStrokePath(context);
    }
    CGContextRestoreGState(context);
}

注意: 通常、スタックベースの操作 (プッシュとポップ) を使用する場合は、それらのバランスが取れていることを簡単に確認できるように、新しいスコープ (余分な{とを使用) を作成します。}もちろん、これはオプションです。

于 2012-08-13T19:18:48.380 に答える
1

各ループでコンテキストをポップしていますが、プッシュしていません。したがって、コンテキスト スタックのコンテキストが不足しています。

UIGraphicsPopContext 呼び出しを削除し、修正されるかどうかを確認します。

于 2012-08-13T19:11:37.637 に答える