我在这里有一些工作代码可以完成您尝试做的事情。只需确保backgroundColor
将 UIView 设置为clearColor
.
这是drawRect:
方法:
- (void)drawRect:(CGRect)rect {
[[UIColor purpleColor] setFill];
CGContextRef context = UIGraphicsGetCurrentContext();
for (UIView *subview in self.subviews) {
CGContextAddPathWithRect(context, subview.frame, NO);
}
CGContextAddPathWithRect(context, rect, YES);
CGContextFillPath(context);
}
本质上,这里发生的事情是我们为逆时针方向的子视图创建了一堆路径,然后我们为当前视图的框架创建了一个顺时针方向的大路径。然后,由于奇偶规则,它只会对视图中未被子视图覆盖的部分着色。
我创建了这个函数CGContextAddPathWithRect
来使代码更清晰、更易于阅读。这是它的实现:
void CGContextAddPathWithRect(CGContextRef context, CGRect rect, BOOL clockwise) {
CGFloat x, y, width, height;
x = rect.origin.x; y = rect.origin.y;
width = rect.size.width; height = rect.size.height;
if (clockwise) {
CGContextMoveToPoint(context, x, y);
CGContextAddLineToPoint(context, x + width, y);
CGContextAddLineToPoint(context, x + width, y + height);
CGContextAddLineToPoint(context, x, y + height);
} else {
CGContextMoveToPoint(context, x + width, y + height);
CGContextAddLineToPoint(context, x + width, y);
CGContextAddLineToPoint(context, x, y);
CGContextAddLineToPoint(context, x, y + height);
}
CGContextClosePath(context);
}
这是我创建的测试项目的 zip 链接:SOHoleSubviews.zip