首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGPath裁剪

CGPath裁剪
EN

Stack Overflow用户
提问于 2016-04-18 16:08:49
回答 2查看 960关注 0票数 0

我想做一些类似这样的东西:

我尝试了以下代码:

代码语言:javascript
复制
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));
}

然后绘制以下路径:

代码语言:javascript
复制
CAShapeLayer *layer = self.layers[line];
layer.path = strokePath;
layer.strokeColor = nil;
layer.fillColor = data.lineColor.CGColor;
layer.fillRule = kCAFillRuleEvenOdd;

Bt提供类似如下的功能:

有谁知道我是怎么做到的吗?

EN

回答 2

Stack Overflow用户

发布于 2016-04-18 16:45:59

绘制线条和圆,不是作为复合路径,而是作为两条线和一个圆(并且没有任何填充规则)。然后通过使用kCGBlendModeClear绘制一个较小的实心圆来“冲出”圆中心的孔。

或者,从裁剪掉圆中心的孔开始。然后画出线和圆圈。

票数 2
EN

Stack Overflow用户

发布于 2016-04-19 14:35:56

最后通过一个图层蒙版来完成:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36688524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档