【问题标题】:CGContextRef and even-odd fill ruleCGContextRef 和奇偶填充规则
【发布时间】:2014-05-01 17:15:55
【问题描述】:

我需要将 CGContext 中的一系列路径绘制为一个块。这些路径是由用户绘制的,所以我无法确定它们的方向。我使用下面的代码sn-p来绘制路径:

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);

但是,如果路径是在相反方向创建的,则生成的绘图似乎会生成一个重叠部分被剔除的绘图,相当于将奇偶规则设置为是。

有什么建议吗?

【问题讨论】:

    标签: ios uibezierpath drawing2d


    【解决方案1】:

    您可以用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);
        });
    }
    

    【讨论】:

    • 我认为这行不通,因为我需要使块颜色半透明,我在最初的问题中忘记提及了。这将导致每次将形状绘制到前一个形状上,因此您不会得到平坦的半透明颜色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多