假设:
ctx
{0,0,100,100}
)
r
),框架{25,25,50,50}
将上下文剪切到该矩形很容易:
CGContextClipToRect(ctx, r);
掩盖(红色==掩码)下面的红色区域:
但是我想反转这个裁剪矩形将其转换为裁剪掩码。期望的结果是掩盖(红色==掩码):
下面的红色部分
我想在运行时以编程方式执行此操作。
我不想要手动准备位图图片,以便随我的应用静态发货。
鉴于ctx
和r
,如何在运行时最容易/直接地完成这项工作?
答案 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()
}
}