剪切反向绘图?

时间:2012-11-25 17:52:44

标签: iphone geometry drawing core-graphics clipping

我想删除以下图片的蓝色部分。如何剪切绘图的反转? (我相信这是提问的正确方法)

Triangle的示例代码:(如果有更好的三角形代码,我也会接受!;)

    int lineWidth = 4;

    int w = size.size.width;
    int h = size.size.height - lineWidth;

    CGPoint top = CGPointMake(0+(w/2)+.5, 0);

    CGContextClipToRect(ctx, CGRectMake(0, 0, w, h));
    CGContextStrokePath(ctx);

    CGContextMoveToPoint(ctx, top.x, top.y);
    CGContextAddLineToPoint(ctx, top.x + (w/2), top.y + h  );
    CGContextAddLineToPoint(ctx, top.x - (w/2), top.y + h   );
    CGContextAddLineToPoint(ctx, top.x, top.y);

    CGContextFillPath(ctx);

    CGContextSetLineWidth(ctx, lineWidth);
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextMoveToPoint(ctx, top.x, top.y);
    CGContextAddLineToPoint(ctx, top.x + (w/2), top.y + h  );
    CGContextAddLineToPoint(ctx, top.x - (w/2), top.y + h   );
    CGContextAddLineToPoint(ctx, top.x, top.y);

    CGContextStrokePath(ctx);

enter image description here

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用UIBazierPath。根据您的意图绘制Bazier路径。然后调用[path addClip]方法。它将剪切封闭路径外的所有内容 例如,以下代码会使您的视图成为一个角落。

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                           byRoundingCorners:UIRectCornerAllCorners
                                                 cornerRadii:CGSizeMake(6.0, 6.0)];
[path addClip];

答案 1 :(得分:0)

要剪切任何路径的反转,只需在剪辑中添加一个封闭的矩形。

在这种情况下,如果我找到你,你想要剪掉形状的红色笔划。通常,由于描边路径的线宽,这在石英中不是一件容易的事。当然,对于这两种形状,我们可以计算红色笔划的轮廓并围绕它进行剪裁。但是一般解决方案需要一种方法来计算包含路径,包括线宽。

还有其他方法可以包含位图蒙版 - 但最佳解决方案取决于您绘制的具体内容。我只是遇到了类似的问题,我可以使用专门的石英混合模式非常优雅和高效地解决问题。这在很大程度上取决于绘图前centext的内容以及结果应如何与UI的其余部分混合。