Вырезать прямоугольник из NSBezierPath - PullRequest
7 голосов
/ 16 апреля 2011

Можно ли удалить фрагмент NSBezierPath, который определяется областью NSRect в пути?

Ответы [ 2 ]

9 голосов
/ 13 июля 2013

Как было отмечено в комментариях, ответ мистера Касвелла фактически противоположен тому, что спрашивал ОП.В этом примере кода показано, как удалить прямоугольник из круга (или любой путь Безье из любого другого пути Безье).Хитрость заключается в том, чтобы «обратить» путь, который вы хотите удалить, и затем добавить его к исходному пути:

NSBezierPath *circlePath = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(0, 0, 100, 100)];
NSBezierPath *rectPath = [NSBezierPath bezierPathWithRect:NSMakeRect(25, 25, 50, 50)];
rectPath = [rectPath bezierPathByReversingPath];
[circlePath appendBezierPath:rectPath];

Примечание: все становится немного сложнее, если пути Безье пересекаются друг с другом.Затем вы должны установить правильное «правило намотки».

5 голосов
/ 16 апреля 2011

Абсолютно. Вот что делают регионы отсечения :

// Save the current clipping region
[NSGraphicsContext saveGraphicsState];
NSRect dontDrawThisRect = NSMakeRect(x, y, w, h);
// Either:
NSRectClip(dontDrawThisRect);
// Or (usually for more complex shapes):
//[[NSBezierPath bezierPathWithRect:dontDrawThisRect] addClip];
[myBezierPath fill];    // or stroke, or whatever you do
// Restore the clipping region for further drawing
[NSGraphicsContext restoreGraphicsState];
...