6

我想在我的上剪裁绘图,CGContext但我需要它,即我想在我的剪裁路径中添加几个矩形,CGContextAddRect()并且剪裁应该以我添加到剪裁中的所有矩形的方式完成路径不受任何绘图操作的影响。通常,它只是相反的方式,即绘图函数绘制到已添加到剪切路径的矩形,而未添加到剪切路径的区域不受影响。所以我想我需要的只是一种在调用CGContextClip(). 回到 QuickDraw 时代,这可以通过使用区域然后调用来轻松完成XorRgn()对于每个矩形。但是使用 Quartz 似乎更复杂。有没有人有一个简单的解决方案来实现这一点,或者我是否需要自己进行所有这些路径反转计算?

4

2 回答 2

7

您可以将整个边界添加为矩形,然后添加要从绘图中排除的矩形并使用CGContextEOClip.

例子:

- (void)drawRect:(NSRect)dirtyRect
    CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];
    //Fill the background with gray:
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 1);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
    CGContextAddRect(ctx, NSRectToCGRect(self.bounds));
    //Add some rectangles:
    CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
    CGContextAddRect(ctx, CGRectMake(120, 120, 50, 100));
    //Clip:
    CGContextEOClip(ctx);
    //Fill the entire bounds with red:
    CGContextSetRGBFillColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
}

如果您在最后绘制图像而不是填充红色矩形,效果会变得更加明显。

于 2012-05-17T16:18:47.563 回答
2

一种方法是将剪切路径绘制到位图上下文,反转生成的位图,并通过调用将其用作原始图像上的蒙版CGContextClipToMask()

于 2012-05-17T15:51:57.840 回答