1

我需要在 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

4

3 回答 3

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

编辑:这两种方法都需要backgroundColorclearColorandopaque设置为 NO。

第二次编辑:最初的问题是关于核心图形的。当然,还有其他方法可以遮盖视图的一部分。最值得注意CALayer的是 的mask财产。

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

于 2012-08-29T13:27:59.360 回答
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);

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

于 2012-08-29T12:55:05.380 回答
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);
于 2012-08-29T12:56:27.953 回答