1

次の描画コードがあります。

[[NSColor redColor] set];
NSRect fillRect = NSMakeRect(bounds.size.width - 20.0f, 0.0f, 20.0f, 20.0f);
NSBezierPath *bezier1 = [NSBezierPath bezierPathWithRoundedRect:fillRect xRadius:10.0f yRadius:10.0f];

[bezier1 fill];

NSRect fill2 = fillRect;
fill2.origin.x += 5;
fill2.origin.y += 5;

fill2.size.width -= 10.0f;
fill2.size.height -= 10.0f;

NSBezierPath *bezier2 = [NSBezierPath bezierPathWithRoundedRect:fill2 xRadius:5.0f yRadius:5.0f];
[[NSColor greenColor] set];

[bezier2 fill];

これは次の結果になります。

スクリーンショット

内側の緑色の円が透明になるにはどうすればよいですか? 緑の NSColor を透明な色に置き換えることは機能しません。論理的です ;-)

NSBezierPath のインスタンスを交差させる方法や、これを別のアプローチで解決する方法はありますか?

4

1 に答える 1

3

あなたが探しているのはリングのベジエ パスだと思います。シングルを作成し、ワインディング ルールNSBezierPathを設定することでそれを行うことができます。

[[NSColor redColor] set];
NSRect fillRect = NSMakeRect(bounds.size.width - 20.0f, 0.0f, 20.0f, 20.0f);
NSBezierPath *bezier1 = [NSBezierPath new];
[bezier1 setWindingRule:NSEvenOddWindingRule];   // set the winding rule for filling
[bezier1 appendBezierPathWithRoundedRect:fillRect xRadius:10.0f yRadius:10.0f];

NSRect innerRect = NSInsetRect(fillRect, 5, 5);  // the bounding rect for the hole
[bezier1 appendBezierPathWithRoundedRect:innerRect xRadius:5.0f yRadius:5.0f];

[bezier1 fill];

このNSEvenOddWindingRuleルールは、特定のポイントからパス全体の境界の外側までの線を考慮して、特定のポイントを塗りつぶすかどうかを決定します。その線が偶数のパスを横切る場合は塗りつぶされず、そうでない場合は塗りつぶされます。したがって、内側の円のどの点も塗りつぶされませんが、2 つの間の点はリングになります。

于 2012-06-17T19:26:59.783 に答える