Core Graphics draw line with outline
我正在使用 Core Graphics 绘制一条宽度为 4 像素的任意线,现在我希望这条线具有另一种颜色的 1 像素轮廓。我看不到任何可以实现"开箱即用"的 CG 功能,但我正在寻找有关如何完成的建议。这是我现有的代码:
1 2 3 4 5 6 7 8 9 10 11 12 | CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 4.0); CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue]; CGContextMoveToPoint(context, curPoint.x, curPoint.y); for( int i = 1; i < [points count]; i++ ) { curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue]; CGContextAddLineToPoint(context, curPoint.x, curPoint.y); CGContextStrokePath(context); CGContextMoveToPoint(context, curPoint.x, curPoint.y); } |
这会产生单行。我想生成一条 4px 线,其中 1px 线突出显示 4px 线,如下所示:
1 | CGContextReplacePathWithStrokedPath(CGContextRef c); |
这也存在于旧版 SDK 中 - 例如 iOS 4.1、MacOS X 10.6。
此外,最好创建整个路径,然后在最后对其进行描边(或同时描边并填充) - 换句话说,循环内不需要 CGContextStrokePath。
要为我自己的问题添加答案,可以通过在突出显示颜色中画一条宽几个像素的线,然后在顶部画一条实际线来完成。这会产生轮廓效果。
恐怕您将不得不将线宽设置为 1 再次绘制路径。如果您希望它位于 4 像素路径之外,则必须相应地调整路径。
编辑:我想到了另一种选择 - 你可以画一个图案 - 请参阅 Apple 的 QuartzDemo 以获取示例。
没有一种内置方法可以将笔画转换为路径,然后再对该路径进行描边。也就是说,您可以通过两次绘制线条来近似此值:一次使用 6 像素笔划(每侧 4 像素 1),然后再次使用不同颜色的 4 像素笔划
类似于:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CGContextRef context = UIGraphicsGetCurrentContext(); CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPointValue]; CGContextMoveToPoint(context, curPoint.x, curPoint.y); for( int i = 1; i < [points count]; i++ ) { curPoint = [(NSValue*)[points objectAtIndex:i] CGPointValue]; CGContextAddLineToPoint(context, curPoint.x, curPoint.y); } // Set your 1 pixel highlight color here using CGContextSetRGBStrokeColor or equivalent // CGContextSetRGBStrokeColor(...) CGContextSetLineWidth(context, 6.0); CGContextStrokePath(context); // Set your 4 pixel stroke color here using CGContextSetRGBStrokeColor or equivalent // CGContextSetRGBStrokeColor(...) CGContextSetLineWidth(context, 4.0); CGContextStrokePath(context); |
另一个想法是在绘制描边之前通过 CGContextSetShadowWithColor(context, CGSizeZero, 1.0, yourHighlightColorHere) 设置阴影,尽管这不会绘制完全不透明度的高光颜色。 (我也不记得 shadows 属性是否为阴影描边 - 我只将它们与填充一起使用)