CGPath与大纲

时间:2013-01-16 21:21:54

标签: ios objective-c core-graphics quartz-graphics cgpath

我正在尝试绘制一个中风的CGPath。

基本上我想要使用CGPath绘制一条线。然后,我想回去在最后一个CGPath的两边绘制线条,使其具有轮廓效果。

这条线可以任何方式弯曲和转弯,但我总是需要外面的两条线来跟随。

Path

编辑:我需要能够使线条的中间部分透明,但轮廓线条为黑色。

2 个答案:

答案 0 :(得分:13)

使用CGPathCreateCopyByStrokingPath通过在某个宽度上抚摸旧路径来创建新路径。然后使用kCGPathFillStroke绘制新路径。

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

  CGMutablePathRef path = CGPathCreateMutable();
  CGPathMoveToPoint(path, NULL, 50, 50);
  CGPathAddLineToPoint(path, NULL, 200, 200);

  CGPathRef thickPath = CGPathCreateCopyByStrokingPath(path, NULL, 10, kCGLineCapButt, kCGLineJoinBevel, 0);
  CGContextAddPath(context, thickPath);

  CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
  CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
  CGContextSetLineWidth(context, 3);
  CGContextDrawPath(context, kCGPathFillStroke);

  CGPathRelease(thickPath);
  CGPathRelease(path);
}

答案 1 :(得分:5)

最简单的解决方案就是两次击打路径。首先使用较大笔划宽度的黑色,然后使用蓝色和略小的笔划宽度再次使用相同的路径。

编辑:
如果我没记错的话,你可以使用CGPathCreateCopyByStrokingPath(...)来创建一个新的路径,然后你可以进行描边和填充。然后你可以使用半透明的颜色。

来自文档:

  

CGPathCreateCopyByStrokingPath

     

创建另一条路径的描边副本。

CGPathRef CGPathCreateCopyByStrokingPath(
                                         CGPathRef path,
                                         const CGAffineTransform *transform,
                                         CGFloat lineWidth,
                                         CGLineCap lineCap,
                                         CGLineJoin lineJoin,
                                         CGFloat miterLimit 
                                         ); 
     

<强>参数
  路径
  要复制的路径。

     

变换
  指向仿射变换矩阵的指针,如果不需要转换则为NULL。如果指定,Quartz会将转换应用于转换路径的元素,然后再将它们添加到新路径中。

     

的lineWidth
  要使用的线宽,以用户空间为单位。该值必须大于0。

     

的linecap
  线条样式常量-kCGLineCapButt(默认值),kCGLineCapRound或kCGLineCapSquare。参见“CGLineCap”。

     

lineJoin
  行连接值-kCGLineJoinMiter(默认值),kCGLineJoinRound或kCGLineJoinBevel。参见“CGLineJoin”。

     

miterLimit分别
  要使用的斜接限制。