Quartz2D:如何在运行时将剪切矩形转换为反转掩码?

时间:2013-01-03 19:19:39

标签: ios macos quartz-2d cgcontext

假设:

  1. 带有框架ctx
  2. 的CGContextRef({0,0,100,100}
  3. 和一个矩形(r),框架{25,25,50,50}
  4. 将上下文剪切到该矩形很容易:

    CGContextClipToRect(ctx, r);
    

    掩盖(红色==掩码)下面的红色区域:

    enter image description here

    但是我想反转这个裁剪矩形将其转换为裁剪掩码。期望的结果是掩盖(红色==掩码)

    下面的红色部分

    enter image description here

    我想在运行时以编程方式执行此操作。

    想要手动准备位图图片,以便随我的应用静态发货。

    鉴于ctxr,如何在运行时最容易/直接地完成这项工作?

4 个答案:

答案 0 :(得分:15)

了解“Filling a Path” section of the Quartz 2D Programming Guide中的填充规则。

在您的情况下,最简单的方法是使用偶数填充规则。创建一个由小矩形和一个更大的矩形组成的路径:

CGContextBeginPath(ctx);
CGContextAddRect(ctx, CGRectMake(25,25,50,50));
CGContextAddRect(ctx, CGRectInfinite);

然后,使用奇偶填充规则将此路径交叉到剪切路径:

CGContextEOClip(ctx);

答案 1 :(得分:3)

您可以通过传递构成您想要的红框的rects来剪切上传CGContextClipToRects()

答案 2 :(得分:1)

你能正常做你所有的绘画,然后做:

CGContextClearRect(ctx, r);
一切都完成后

答案 3 :(得分:0)

这是实现 rob's answer 的有用扩展

extension UIBezierPath {
    func addClipInverse() {
        let paths = UIBezierPath()
        paths.append(self)
        paths.append(.init(rect: .infinite))
        paths.usesEvenOddFillRule = true
        paths.addClip()
    }
}