【问题标题】:CGPath clippingCGPath 裁剪
【发布时间】:2016-04-18 08:08:48
【问题描述】:

我想做类似的东西:

我尝试了以下代码:

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 给出类似的东西:

有谁知道我如何实现这一目标?

【问题讨论】:

    标签: ios objective-c core-graphics


    【解决方案1】:

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

    或者,首先剪掉圆心的孔。然后画线和圆。

    【讨论】:

    • 看我的书,从这里开始:apeth.com/iOSBook/ch15.html#_paths_and_drawing 箭头轴末端三角形缺口的两种切法,本节和下节,正是你想要的做。
    • 谢谢,这确实可行。我最终做的有点不同,见下文。
    【解决方案2】:

    最后使用图层蒙版:

    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;
    

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 2021-11-29
      • 2013-10-22
      • 2013-10-14
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2022-01-23
      • 2020-12-25
      相关资源
      最近更新 更多