Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心图形绘制轮廓线_Iphone_Cocoa Touch_Core Graphics - Fatal编程技术网

Iphone 核心图形绘制轮廓线

Iphone 核心图形绘制轮廓线,iphone,cocoa-touch,core-graphics,Iphone,Cocoa Touch,Core Graphics,我画了一条任意的线,核心图形的宽度为4像素,现在我想这条线有一个1像素的轮廓,另一种颜色。我看不到任何CG功能可以实现这种“开箱即用”的效果,但我正在寻找如何实现这一点的建议。这是我现有的代码: CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 4.0); CGPoint curPoint = [(NSValue*)[points objectAtIndex:0] CGPoi

我画了一条任意的线,核心图形的宽度为4像素,现在我想这条线有一个1像素的轮廓,另一种颜色。我看不到任何CG功能可以实现这种“开箱即用”的效果,但我正在寻找如何实现这一点的建议。这是我现有的代码:

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);
}
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetLineWidth(上下文,4.0);
CGPoint curPoint=[(NSValue*)[points objectAtIndex:0]CGPointValue];
CGContextMoveToPoint(上下文,curPoint.x,curPoint.y);
对于(int i=1;i<[点数];i++){
curPoint=[(NSValue*)[points objectAtIndex:i]CGPointValue];
CGContextAddLineToPoint(上下文,curPoint.x,curPoint.y);
CGContextStrokePath(上下文);
CGContextMoveToPoint(上下文,curPoint.x,curPoint.y);
}
这就产生了一条直线。我想制作一条4px线,其中1px线突出显示4px线,如下所示:


恐怕您必须将线宽设置为1,重新绘制路径。如果您希望它位于4像素路径的外侧,则必须相应地调整路径


编辑:另一个选项出现在脑海中——你可以画一个图案——查看苹果的QuartzDemo以了解如何将笔划转换为路径的示例。

没有内置方法将笔划转换为路径,然后再画该路径。这就是说,您可以通过绘制两次线来近似这一点:一次是6像素笔划(每边4像素+1),然后是不同颜色的4像素笔划

类似于:

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);
CGContextRef context=UIGraphicsGetCurrentContext();
CGPoint curPoint=[(NSValue*)[points objectAtIndex:0]CGPointValue];
CGContextMoveToPoint(上下文,curPoint.x,curPoint.y);
对于(int i=1;i<[点数];i++){
curPoint=[(NSValue*)[points objectAtIndex:i]CGPointValue];
CGContextAddLineToPoint(上下文,curPoint.x,curPoint.y);
}
//使用CGContextSetRGBStrokeColor或等效工具在此处设置1像素高光颜色
//CGContextSetRGBStrokeColor(…)
CGContextSetLineWidth(上下文,6.0);
CGContextStrokePath(上下文);
//在此处使用CGContextSetRGBStrokeColor或等效工具设置4像素笔划颜色
//CGContextSetRGBStrokeColor(…)
CGContextSetLineWidth(上下文,4.0);
CGContextStrokePath(上下文);

另一个想法是在绘制笔划之前,通过CGContextSetShadowWithColor(context,CGSizeZero,1.0,yourHighlightColorHere)设置阴影,尽管这不会以完全不透明度绘制高光颜色。(我也不记得阴影是否具有阴影笔划属性-我只在填充时使用过它们)

iOS 5.0添加了一个新功能
CGPathCreateCopyByStrokingPath()
,它可以满足您的需要

首先为黑色路径创建一个
CGPathRef
,然后使用
CGPathCreateCopyByStrokingPath()
创建它的副本

这将给你一个新的路径,你可以在黑色中填充,在红色中划,以得到你想要的


另外,创建路径有点慢。在执行屏幕绘制时,应避免创建路径。所有路径都应存储在RAM中,并在开始绘制到屏幕之前准备就绪
drawRect:
应该只绘制路径,而不是创建路径。

要为我自己的问题添加答案,可以在高亮颜色中绘制一条宽几个像素的线,然后在顶部绘制实际的线。这会产生轮廓效果。

类似于Abhi Beckert的建议,但您可以使用此功能:

CGContextReplacePathWithStrokedPath(CGContextRef c);
这也存在于较旧的SDK中,例如iOS 4.1、MacOS X 10.6

另外,最好创建整个路径,然后在最后对其进行笔划(或者同时进行笔划和填充)——换句话说,不需要在循环中使用CGContextStrokePath。

这就是我的想法。我可以算出这条线是垂直的还是水平的,但它是一条任意的线,可以以任何形状朝任何方向移动,所以我不确定如何计算正确的位置。我需要更好地了解你实际上在做什么。你能发布一些示例图片吗?它实际上是由用户徒手绘制的,所以它可以是绝对任何形状。当然,我理解,但我不知道效果应该是什么。举个例子会有帮助。我想这可能会有帮助:我被Abhi纠正了-看起来CGPathCreateCopyByStrokingPath()是iOS 5中的新API(很酷!)也是iOS 5之前的一个等价物-CGContextReplacePathWithStrokedPath-它已经存在很长时间了。