凹面NSBezierPath

时间:2012-06-17 16:43:35

标签: cocoa appkit nsbezierpath

我有以下图纸代码:

[[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];

结果如下:

Screenshot

如何确定内部绿色圆圈是透明的?用透明颜色替换绿色NSColor不起作用,合乎逻辑; - )

有没有办法交叉NSBezierPath的实例或用另一种方法解决这个问题?

1 个答案:

答案 0 :(得分: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规则通过考虑从该点到整个路径边界之外的线来确定是否填充特定点;如果该线穿过偶数路径,则不填充,否则为。所以内圈中的任何一点都不会被填充,而两者之间的点将是 - 结果是一个环。