CGPath剪辑

时间:2016-04-18 08:08:49

标签: ios objective-c core-graphics

我想做类似的事情:

Example

我尝试了以下代码:

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, &CGAffineTransformIdentity, points, sizeof points / sizeof *points);

CGMutablePathRef strokePath = (CGMutablePathRef)CGPathCreateCopyByStrokingPath(path, &CGAffineTransformIdentity, data.lineWidth, kCGLineCapRound, kCGLineJoinMiter, 4.f);

for(NSInteger i = 0; i < [data.values count]; i++) {
    CGRect rect = CGRectMake(points[i].x - data.dotRadius, points[i].y - data.dotRadius, data.dotRadius * 2, data.dotRadius * 2);
    CGPathAddEllipseInRect(strokePath, &CGAffineTransformIdentity, rect);
    CGPathAddEllipseInRect(strokePath, &CGAffineTransformIdentity, CGRectInset(rect, data.lineWidth, data.lineWidth));
}

然后绘制这条路径:

CAShapeLayer *layer = self.layers[line];
layer.path = strokePath;
layer.strokeColor = nil;
layer.fillColor = data.lineColor.CGColor;
layer.fillRule = kCAFillRuleEvenOdd;

Bt给出了类似的东西:

Result

有没有人知道如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

绘制线条和圆圈,而不是复合路径,而是绘制两条线和一条圆(并且没有任何填充规则)。然后&#34;冲出&#34;通过使用kCGBlendModeClear绘制一个较小的实心圆来确定圆心的孔。

或者,首先剪掉圆心的孔。然后绘制线条和圆圈。

答案 1 :(得分:0)

使用图层蒙版进行结束:

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddLines(path, &CGAffineTransformIdentity, points, sizeof points / sizeof *points);

CGMutablePathRef dotPath = CGPathCreateMutable();
for(NSInteger i = 0; i < [data.values count]; i++) {
    CGRect rect = CGRectMake(points[i].x - data.dotRadius, points[i].y - data.dotRadius, data.dotRadius * 2, data.dotRadius * 2);
    CGPathAddEllipseInRect(dotPath, &CGAffineTransformIdentity, rect);
    CGPathAddEllipseInRect(dotPath, &CGAffineTransformIdentity, CGRectInset(rect, data.lineWidth, data.lineWidth));
}
CGPathAddPath(path, &CGAffineTransformIdentity, dotPath);

CGMutablePathRef maskPath = CGPathCreateMutable();
CGPathAddRect(maskPath, &CGAffineTransformIdentity, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
CGPathAddPath(maskPath, &CGAffineTransformIdentity, dotPath);


CAShapeLayer *layer = self.layers[line];
layer.path = strokePath;
layer.lineWidth = 2;
layer.strokeColor = data.lineColor.CGColor;
layer.fillColor = nil;
layer.fillRule = kCAFillRuleEvenOdd;

CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.path = maskPath;
maskLayer.fillRule = kCAFillRuleEvenOdd;
layer.mask = maskLayer;