Ios 自定义地图路径线

Ios 自定义地图路径线,ios,ios6,mkmapview,mkoverlay,Ios,Ios6,Mkmapview,Mkoverlay,我很难在地图上用笔划划出一条线。(内部颜色和外部颜色)我相信我走的是正确的道路,并且有子类mkOverlayView来覆盖图形(需要填充道路大小),因此内部drawMapRect CGFloat lineWidth = MKRoadWidthAtZoomScale(zoomScale); MKMapRect clipRect = MKMapRectInset(mapRect, -lineWidth, -lineWidth); ... CGContextAddPath(context,

我很难在地图上用笔划划出一条线。(内部颜色和外部颜色)我相信我走的是正确的道路,并且有子类mkOverlayView来覆盖图形(需要填充道路大小),因此内部drawMapRect

CGFloat lineWidth = MKRoadWidthAtZoomScale(zoomScale);

MKMapRect clipRect = MKMapRectInset(mapRect, -lineWidth, -lineWidth);

  ...

CGContextAddPath(context, path);
CGContextSetStrokeColorWithColor(context, line.color.CGColor);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, lineWidth);
CGContextSetAlpha(context, 0.4f);
CGContextStrokePath(context);

CGPathRelease(path);
我不知道如何添加笔划。任何帮助都将不胜感激。xcode 4.6/ios 6.0+


首先用颜色1绘制一条路径(道路),然后用颜色2中的*0.6将笔划宽度和颜色更改为较细的线条,然后再次绘制。

好的,我根据马修的建议设法解决了这个问题,但做了一些调整

基本上,我使用
CGPathCreateCopyByStrokingPath
创建了一个笔划路径,并使笔划比底色略暗。然后用路径和笔划创建了一个透明层,使用混合模式KCGBlendModeDestinationTop,并绘制了另一条路径,这次只在顶部填充。我不确定这是否是最好的方法,但似乎效果很好

CGPathRef newpath =  CGPathCreateCopyByStrokingPath(path, NULL, lineWidth, kCGLineCapRound, kCGLineJoinMiter, 0.0);
CGContextAddPath(context, newpath);

CGContextSetStrokeColorWithColor(context, line.color.CGColor);
CGContextSetFillColorWithColor(context,  line.color.CGColor);
CGContextSetLineWidth(context, lineWidth * 0.3);
CGContextSetAlpha(context, 0.8f);
CGContextBeginTransparencyLayer (context, NULL);
CGContextStrokePath(context);
CGContextBeginPath(context);
CGContextAddPath(context, newpath);
CGContextFillPath(context);
CGContextEndTransparencyLayer(context);
CGContextSetBlendMode(context, kCGBlendModeDestinationAtop);
CGContextSetAlpha(context, 0.3f);
CGContextBeginPath(context);
CGContextAddPath(context, newpath);
CGContextFillPath(context);

CGPathRelease(path);
CGPathRelease(newpath);
编辑以下是一个基于AlexWien方法的简单解决方案


我不认为这会起作用,线是透明的,内线需要比外线轻。我的应用程序就是这样做的。这很有效。详细信息由您来设置正确的trancparency级别。让线条不透明。是的,你是对的。正如图中所示,内线是透明的,外线是否透明有点疑问。我认为这很困难。你必须画三条线:内横线、外左线和右线。当缩小更多的可见点时,你还应该观察绘制速度……这似乎是问题的重复。请看答案:。你可能想要
cgcontextreplacepath with strokedpath()
@Mathew谢谢你的推荐,我试过了,得到了这个。。。这就产生了一个新的问题,因为路径是由许多行组成的,我如何将它们组合成一行呢?我不完全确定发生了什么,因为我没有任何类似的代码在本地运行,但是我想知道如果您不希望每个线段都显示端点封口,那么在这里使用“减轻混合”模式是否会有所帮助。文档中说“指定通过选择较浅的样本(前景或背景)来创建合成图像样本。”因此我想知道(我真的不确定)这是否会将端盖上笔划的较深颜色与另一段填充的较浅颜色进行比较,并使用填充颜色,在这个过程中隐藏端点。我想知道的另一种可能性(如果你想试验的话)是使用
CGContextClip()
将一系列子路径转换成一个剪辑路径,并使用该剪辑路径仅在路径边界内绘制填充颜色。我喜欢这篇文章,非常漂亮的图形。
    if (path != nil)
    {

        CGPathRef  path2 = CGPathCreateCopy(path);
        CGFloat hue;
        CGFloat saturation;
        CGFloat brightness;
        CGFloat alpha;

        [line.color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];

        UIColor *c2 =[UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:0.4];
        CGContextAddPath(context, path);

        CGContextSetStrokeColorWithColor(context, c2.CGColor);
        CGContextSetLineJoin(context, kCGLineJoinRound);
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, lineWidth);
        CGContextStrokePath(context);
        CGPathRelease(path);

             CGContextSetBlendMode(context, kCGBlendModeSourceAtop);
            CGContextAddPath(context, path2);
              CGContextSetRGBStrokeColor(context, 1.0f, 1.0f, 1.0f, 0.3f);
            CGContextSetLineJoin(context, kCGLineJoinRound);
            CGContextSetLineCap(context, kCGLineCapRound);
            CGContextSetLineWidth(context, lineWidth/2.0f);
            CGContextStrokePath(context);
            CGPathRelease(path2);

    }