2012-06-17 66 views
1

我有以下的繪圖代碼:凹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

你的問題還不清楚。你能否重申你正在嘗試以另一種方式做的事情? – user1118321

回答

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規則確定是否通過考慮從該點到整個路徑範圍之外的線來填充特定點;如果該線橫跨偶數個路徑,則不填充,否則是。所以內圈的任何一點都不會被填滿,而兩者之間的點將會是 - 導致一個環。

+0

這就是我一直在尋找的感謝:) – jopjip