如何在绘制(和剪裁)时基于CGMutablePathRef剪切drawRect

时间:2012-07-14 20:48:24

标签: ios core-graphics

在我的自定义控件中,我定义了一些带有所需线条和弧线的CGMutablePathRefs来绘制我的控件;一个绘制整体填充形状,另一个绘制镜面高光。我还定义了两个CGMutablePathRefs,它们包含作为控件的活动和非活动状态的剪切掩码所需的路径。

我正在努力应用裁剪路径。我以前使用剪切路径将渐变应用于图像,但那些绘图命令是CGContext ...变种,而不是CGPath ...变种。

出于测试目的,我删除了镜面高光绘图方面,只是试图将一条大路径剪切到较小的路径。这是我一直在测试的:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, inactiveClip); 
    CGContextClosePath(ctx);
    CGContextClip(ctx);

    CGContextAddPath(ctx, frontFace);
    CGContextSetLineWidth(ctx, 1.0);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillPath(ctx);

}

通过在任何绘图之前放置剪切命令,我以为我在对CoreGraphics说,“这是你应该实际绘制的区域。”

唉,什么都没画。

所以假设我向后排序,我试过:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextAddPath(ctx, frontFace);
    CGContextSetLineWidth(ctx, 1.0);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillPath(ctx);

    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, inactiveClip); 
    CGContextClosePath(ctx);
    CGContextClip(ctx);

}

这是对CoreGraphics的说法,“好吧,在你真正对比特进行着色之前,请检查它们是否与这个裁剪区域对比。”

唉,什么都没有被剪掉。

由于我的裁剪路径使用了一些相同的点和控制点,顺序与填充路径一样,我也用CGContextEOClip调用替换了对CGContextClip的调用,看我是不是真的与奇怪的规则作斗争,但这似乎没有任何视觉影响。

我真的不知道是否需要将CGContextAddPath调用与CGContextBeginPath / CGContextClosePath调用括起来,但我试图做的是最小化Apple示例代码和我的代码之间的差异。在他们的CGContext中......在开始/结束通话之间绘制呼叫,所以我也是。

我在这里误解了什么?

0 个答案:

没有答案