減算されたパスをストロークしたい場合は、あなた自身です。Appleは、あるパスから別のパスへの減算を返す(または単にストロークする)APIを提供していません。
(サンプル画像のように)減算されたパスを埋めたいだけの場合は、クリッピングパスを使用してそれを行うことができます。ただし、トリックを使用する必要があります。クリッピングパスにパスを追加すると、新しいクリッピングパスは、古いクリッピングパスと追加されたパスの交点になります。したがってsmallMaskPath
、クリッピングパスに追加するだけでは、内部の領域のみを埋めるsmallMaskPath
ことになります。これは、必要な領域とは逆になります。
あなたがする必要があるのは、既存のクリッピングパスをの逆数と交差させることですsmallMaskPath
。幸いなことに、偶数奇数の巻線ルールを使用すると、これを非常に簡単に行うことができます。偶奇規則については、Quartz2Dプログラミングガイドを参照してください。
基本的な考え方は、2つのサブパスを持つ複合パスを作成することです。1つと、塗りつぶしたいピクセルをsmallMaskPath
完全に囲む巨大な長方形です。smallMaskPath
偶数のルールにより、内側のすべてのピクセルsmallMaskPath
は複合パスの外側として扱われ、外側のすべてのピクセルsmallMaskPath
は複合パスの内側として扱われます。
それでは、この複合パスを作成しましょう。巨大な長方形から始めましょう。そして、無限の長方形よりも大きな長方形はありません。
UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectInfinite];
次に、以下を追加して、複合パスにしsmallMaskPath
ます。
[clipPath appendPath:smallMaskPath];
次に、偶数奇数ルールを使用するパスを設定します。
clipPath.usesEvenOddFillRule = YES;
このパスにクリップする前に、グラフィックスの状態を保存して、完了時にクリッピングパスへの変更を元に戻すことができるようにする必要があります。
CGContextSaveGState(UIGraphicsGetCurrentContext()); {
これで、クリッピングパスを変更できます。
[clipPath addClip];
そして私たちは満たすことができbigMaskPath
ます:
[[UIColor orangeColor] setFill];
[bigMaskPath fill];
最後に、グラフィックスの状態を復元し、クリッピングパスへの変更を元に戻します。
} CGContextRestoreGState(UIGraphicsGetCurrentContext());
コピー/貼り付けする場合に備えて、コードをまとめて次に示します。
UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectInfinite];
[clipPath appendPath:smallMaskPath];
clipPath.usesEvenOddFillRule = YES;
CGContextSaveGState(UIGraphicsGetCurrentContext()); {
[clipPath addClip];
[[UIColor orangeColor] setFill];
[bigMaskPath fill];
} CGContextRestoreGState(UIGraphicsGetCurrentContext());