2011-04-15 16 views

Respuesta

5

Absolutamente. Esto es lo que clipping regions hacer:

// 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]; 
+0

NSRectClip es el nombre correcto de la función – sergeyne

+0

Gracias, @sergeyne, corregido! –

+4

NSRectClip no es correcto. Se cruza con el clippath actual. Entonces, después de aplicarlo, solo se dibuja contenido dentro de dontDrawThisRect, sacando esta área de la región de recorte. Por lo tanto, es todo lo contrario de lo que quería el OP. –

9

Como se señaló en los comentarios, la respuesta del Sr. Caswell en realidad es lo contrario de lo que el PO estaba pidiendo. Este ejemplo de código muestra cómo eliminar un rect de un círculo (o cualquier camino de beier de cualquier otro camino de bezier). El truco está en "revertir" el camino que desea eliminar, y luego añadirlo a la ruta original:

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

Nota: las cosas se ponen un poco más difícil si los trazados Bézier se cruzan entre sí. Luego debe establecer la "regla de devanado" adecuada.

Cuestiones relacionadas