CGContextRef和偶数填充规则

时间:2014-03-24 11:17:11

标签: ios uibezierpath drawing2d

我需要在CGContext中绘制一系列路径作为块。这些路径由用户绘制,因此我无法确定其方向。我使用以下代码片段绘制路径:

CGContextSaveGState(context);
UIBezierPath *fillPath = [ UIBezierPath bezierPath ];

for ( UIBezierPath *path in arrayOfPaths ) {
    [ fillPath appendPath:path ];
}

CGContextAddPath(context, fillPath.CGPath );
CGContextSetFillColorWithColor( context, [[UIColor GreenColor ] colorWithAlphaComponent:0.3 ].CGColor );
CGContextFillPath(context);

但是,如果路径是以相反方向创建的,则生成的图形似乎会生成一个图形,其中重叠部分被淘汰,相当于将奇偶规则设置为是。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用CGContextSaveGState / CGContextRestoreGState指令围绕填充每条路径的线条。这样你就可以“从头开始”,即。每个填充物都有一个干净的路径堆栈。

编辑:我有一个很好的包装功能:

void CGContextBlock(CGContextRef ctx, void (^block)())
{
    CGContextSaveGState(ctx);
    block();
    CGContextRestoreGState(ctx);
}

使用它:

CGContextSetFillColorWithColor(context, [UIColor GreenColor].CGColor);
for (UIBezierPath *path in arrayOfPaths)
{
    CGContextBlock(context, ^{
        CGContextAddPath(context, path.CGPath);
        CGContextFillPath(context);
    });
}