1

一連のパスを CGContext にブロックとして描画する必要があります。これらのパスはユーザーが描いたものなので、方向を判断できません。次のコード スニペットを使用してパスを描画します。

CGContextSaveGState(context);
UIBezierPath *fillPath = [ UIBezierPath bezierPath ];

for ( UIBezierPath *path in arrayOfPaths ) {
    [ fillPath appendPath:path ];
}

CGContextAddPath(context, fillPath.CGPath );
CGContextSetFillColorWithColor( context, [[UIColor GreenColor ] colorWithAlphaComponent:0.3 ].CGColor );
CGContextFillPath(context);

ただし、パスが逆方向に作成された場合、結果の図面は、重なり合うセクションがノックアウトされた図面を生成するように見えます。これは、偶奇規則を [はい] に設定するのと同じです。

助言がありますか?

4

1 に答える 1

0

CGContextSaveGState各パスを埋める行を/CGContextRestoreGState命令で囲むことができます。そうすれば、「ゼロから」、つまり. 各塗りつぶしに、クリーン パス スタックを使用します。

編集:これには素敵なラッピング機能があります:

void CGContextBlock(CGContextRef ctx, void (^block)())
{
    CGContextSaveGState(ctx);
    block();
    CGContextRestoreGState(ctx);
}

そのように使用します:

CGContextSetFillColorWithColor(context, [UIColor GreenColor].CGColor);
for (UIBezierPath *path in arrayOfPaths)
{
    CGContextBlock(context, ^{
        CGContextAddPath(context, path.CGPath);
        CGContextFillPath(context);
    });
}
于 2014-03-24T11:21:40.877 に答える