2013-01-31 89 views
3

我無法在筆畫上繪製一條線。 (內部顏色和顏色外)我beleive我在正確的道路上,並子類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+

enter image description here

+0

好像問題http://stackoverflow.com/q/8960249/650350的重複。請參閱答案:http://stackoverflow.com/a/9193196/650350。你可能想'CGContextReplacePathWithStrokedPath()' – Mathew

+0

@Mathew謝謝你的建議,我試了一下,得到了這個...... http://imgur.com/t8IuKSM它創建了一個新問題,因爲路徑由多行組成我將它們合併爲一個? – glued

回答

2

衝程第一路徑(與道路)與顏色1,則筆劃寬度和顏色與道路與再次改變成較細的線×0.6顏色2,和中風。

+0

我不認爲這會工作,線是透明的,內線需要比外線輕。 – glued

+0

我的應用程序執行此操作。這工作。細節取決於你設置正確的透明度水平。使線條不透明。 – AlexWien

+0

是的,你是對的。完全如圖中所示,內部線是透明的,外部是有點懷疑它是否透明。我認爲,如所顯示的那樣很難。您將不得不畫出三條線:內部反式,外部左側和右側 – AlexWien

2

好吧,我設法弄清楚根據馬修的建議,但有一些調整...

enter image description here

基本上我創建使用CGPathCreateCopyByStrokingPath描邊路徑和所做的行程比基稍深顏色。然後用路徑和描邊創建一個transparentLayer,使用混合模式kCGBlendModeDestinationAtop,並繪製了另一條路徑,這次只填充一條路徑。我不確定這是否是最好的方法,但似乎運作良好。

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的做法一個簡單的解決方案 enter image description here

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); 

    } 
+0

I我不完全確定發生了什麼,因爲我沒有任何類似的代碼在本地運行,但是我想知道如果您不希望每個線段都顯示端蓋,那麼使用**淡化**混合模式是否會對您有所幫助。該文檔顯示「指定通過選擇較輕的樣本(來自前景或背景)來創建合成圖像樣本。」所以我想知道(我真的不確定),如果這會比較端蓋上筆劃的較暗顏色和另一個區域的填充顏色較淺的顏色,並使用填充顏色,在過程中隱藏端蓋。 – Mathew

+0

我想知道的另一種可能性(再次,如果你想實驗)使用'CGContextClip()'將一系列子路徑變成一個剪切路徑,並使用該剪切路徑僅將繪製填充顏色路徑。 – Mathew

+0

@Mathew是啊我過度思考它,看編輯 – glued