CGContextClip()使用反向路径

And*_*eas 6 macos cocoa macos-carbon quartz-graphics

我希望在我的上画剪辑,CGContext但我需要它反过来,即我想要使用剪切路径添加几个矩形,CGContextAddRect()剪辑应该按照我添加到剪辑中的所有矩形的方式完成路径不受任何绘图操作的影响.通常情况下,它只是反过来,即绘图函数绘制到已添加到剪切路径的矩形,并使未添加到剪切路径的区域不受影响.所以我想我需要的只是一种在调用之前反转剪切路径的方法CGContextClip().回到QuickDraw时代,可以通过使用区域然后调用XorRgn()每个矩形轻松完成.但是使用Quartz似乎更复杂.有没有人有一个简单的解决方案来实现这一点,还是我需要自己做所有这些路径反转计算?

omz*_*omz 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));
}
Run Code Online (Sandbox Code Playgroud)

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

  • 好的,我想我现在已经知道了.我必须为我正在添加的每个剪切矩形调用一次CGContextEOClip().然后它甚至可以与重叠的矩形一起工作!非常感谢提示! (3认同)