在它的超级视图中掩盖视图的路径以显示它的SuperSupervView

时间:2013-09-20 18:05:14

标签: iphone ios objective-c uiview core-graphics

我试图想象如何基于它的子视图的路径来掩盖视图的路径以揭示底层视图。我不确定我是否可以清楚地表达我想要做的事情,所以这是我画的照片:

my beautiful drawing

进一步澄清并推动点回家 - 视图3是视图2的子视图。视图2是视图1的子视图。视图3具有透明背景,显示视图1.

我希望能够根据View 2的子视图动态屏蔽这个区域。所以 - 在视图2的drawRect中 - 我希望能够调查其子视图,获得它们的帧,并将视图2屏蔽到这些帧。

我对iOS / Objective-c的其余部分并不太讨厌,但我仍然倾向于使用Core Graphics并且无法完全理解这一点。任何帮助将非常感激。

2 个答案:

答案 0 :(得分:0)

一种简单的方法可能是View 2可以绘制所有自身,就好像没有子视图一样,然后迭代每个子视图框架调用NSEraseRect的子视图。请注意,视图3必须完全透明(即不绘制任何东西)才能使其正常工作。

答案 1 :(得分:0)

我在这里有一些工作代码可以完成你想要做的事情。只需确保将UIView的backgroundColor设置为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