UIView drawRect():填充除polygon之外的所有内容

时间:2012-08-29 11:39:33

标签: objective-c ios polygon quartz-2d drawrect

我需要使用'reverted polygon'在drawRect()方法中填充我的UIView - 视图中的所有内容都填充了除多边形本身之外的一些颜色。

我有这个代码来绘制一个简单的多边形:

CGContextBeginPath(context);
for(int i = 0; i < corners.count; ++i)  
{
    CGPoint cur = [self cornerAt:i], next = [self cornerAt:(i + 1) % corners.count];
    if(i == 0)
        CGContextMoveToPoint(context, cur.x, cur.y);
    CGContextAddLineToPoint(context, next.x, next.y);
}
CGContextClosePath(context);
CGContextFillPath(context);

我发现了类似的问题,但在C#中,不是Obj-C:c# fill everything but GraphicsPath

3 个答案:

答案 0 :(得分:3)

可能最快的方法是设置剪辑:

// create your path as posted
// but don't fill it (remove the last line)

CGContextAddRect(context, self.bounds);
CGContextEOClip(context);

CGContextSetRGBFillColor(context, 1, 1, 0, 1);
CGContextFillRect(context, self.bounds);

其他答案都建议首先填充矩形,然后在顶部绘制颜色清晰的形状。两者都省略了必要的混合模式。这是一个工作版本:

CGContextSetRGBFillColor(context, 1, 1, 0, 1);
CGContextFillRect(context, self.bounds);

CGContextSetBlendMode(context, kCGBlendModeClear);

// create and fill your path as posted

修改:这两种方法都要求将backgroundColor clearColoropaque设置为NO。

第二次编辑:最初的问题是关于Core Graphics。当然还有其他方法来掩盖视图的一部分。最值得注意的是CALayer mask属性。

您可以将此属性设置为包含剪辑路径的CAPathLayer实例,以创建模板效果。

答案 1 :(得分:0)

在drawRect中,您可以使用您想要的颜色

设置视图的背景颜色
    self.backgroundColor = [UIcolor redColor]; //set ur color

然后按照你的方式画一个多边形。

CGContextBeginPath(context);
for(int i = 0; i < corners.count; ++i)  
{
    CGPoint cur = [self cornerAt:i], next = [self cornerAt:(i + 1) % corners.count];
    if(i == 0)
        CGContextMoveToPoint(context, cur.x, cur.y);
    CGContextAddLineToPoint(context, next.x, next.y);
}
CGContextClosePath(context);
CGContextFillPath(context);

希望它有所帮助......快乐的编码:)

答案 2 :(得分:0)

创建一个新的CGLayer,用外部颜色填充它,然后使用清晰的颜色绘制多边形。

layer1 = CGLayerCreateWithContext(context, self.bounds.size, NULL);
context1 = CGLayerGetContext(layer1);

[... fill entire layer ...]

CGContextSetFillColorWithColor(self.context1, [[UIColor clearColor] CGColor]);

[... draw your polygon ...]

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextDrawLayerAtPoint(context, CGPointZero, layer1);