2013-02-16 53 views
5

मैं MKPolylineView पर एक अच्छा MKPolyline खींचने का प्रयास कर रहा हूं। सब कुछ महान अब तक जा रहा है - पॉलीलाइन खींचता है मैं इसे करना चाहते हैं और बस के रूप में जब मैं इसे निम्नलिखित कोड का उपयोग कर करना चाहते हैं:ड्रा MKPolyline रंग भरें

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    MKOverlayView* overlayView = nil; 
    self.routeLineView = [[MKPolylineView alloc] initWithPolyline:[self routeLine]]; 
    [[self routeLineView] setFillColor:[UIColor colorWithRed:167/255.0f green:210/255.0f blue:244/255.0f alpha:1.0]]; 
    [[self routeLineView] setStrokeColor:[UIColor colorWithRed:0/255.0f green:136/255.0f blue:255/255.0f alpha:1.0]]; 
    [[self routeLineView] setLineWidth:15.0]; 
    [[self routeLineView] setLineCap:kCGLineCapRound]; 
    overlayView = [self routeLineView]; 
    return overlayView; 
} 
:

[[self map] addOverlay:routeLine]; 

और इस विधि यह कैसे आकर्षित करने के लिए एप्लिकेशन को बताने के लिए

परिणामस्वरूप मुझे एक ठोस नीले रंग की रेखा मिलती है। मैं जो नीला देखता हूं वह स्ट्रोक के साथ भरने वाला रंग नहीं है, मैं उम्मीद कर रहा हूं - यह स्ट्रोक रंग का नीला है। जब मैं इस विधि का उपयोग करता हूं तो कोई भरने का रंग नहीं होता है। पॉलीलाइन पर भरने वाले रंग को क्यों नहीं खींचता है?

आगे की जांच के बाद, मैं Xcode के त्वरित सहायता खंड में जानकारी के इस tidbit पाया:

MKPolylineView वर्ग एक MKPolyline एनोटेशन वस्तु के लिए दृश्य प्रतिनिधित्व प्रदान करता है। यह दृश्य एनोटेशन द्वारा प्रतिनिधित्व पथ को स्ट्रोक करता है। (यह कक्षा पथ से संलग्न क्षेत्र को भरती नहीं है।) आप MKOverlayPathView क्लास से प्राप्त गुणों को संशोधित करके पथ के रंग और अन्य ड्राइंग विशेषताओं को बदल सकते हैं।

यह हास्यास्पद लगता है। मुझे इस कक्षा का उपयोग पर भरने के रंग का उपयोग करना है, लेकिन मैं इस वर्ग का उपयोग ड्रा भरने के रंग का उपयोग नहीं कर सकता? यह बहुत अजीब लगता है कि यह पहले से ही स्ट्रोक खींचता है। प्रलेखन से इस स्पष्टीकरण में आखिरी पंक्ति थोड़ा अस्पष्ट है लेकिन एक उत्तर प्रदान करने लगता है - मुझे बस जवाब देने में कठिनाई हो रही है। मेरे पास प्रोजेक्ट में MKOverlayPathView नहीं है (वैसे भी क्या है?) लेकिन ऐसा लगता है कि यह समाधान है - क्या किसी को इसका उपयोग करने का तरीका पता है?

+0

'' MKPolylineView' MKOverlayPathView' का एक उपवर्ग है। भले ही, आप 'MKPolygon'' (और 'MKPolylineView'' को 'MKPolyline' के बजाय) का उपयोग करना चाहते हैं। 'एमके पोलिगॉन' स्ट्रोक और भर दोनों को खींचता है। – Rob

उत्तर

15

यदि आप एक रंग की रेखा चाहते हैं, और दूसरे को भरना चाहते हैं, तो MKPolyline के बजाय MKPolygon का उपयोग करें। तो तदनुसार एनोटेशन के अपने मूल निर्माण को संशोधित करें। और फिर आप अपने viewForOverlay (या, iOS 7 के लिए, rendererForOverlay) MKPolygon समझते हैं और निम्नलिखित की तरह कुछ करने के लिए संशोधित:

// for iOS7+; see `viewForOverlay` for earlier versions 

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolygon class]]) 
    { 
     MKPolygonRenderer *renderer = [[MKPolygonRenderer alloc] initWithPolygon:overlay]; 

     renderer.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     renderer.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     renderer.lineWidth = 3; 

     return renderer; 
    } 

    return nil; 
} 

// for iOS versions prior to 7; see `rendererForOverlay` for iOS7 and later 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolygon class]]) 
    { 
     MKPolygonView *overlayView = [[MKPolygonView alloc] initWithPolygon:overlay]; 

     overlayView.fillColor  = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     overlayView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     overlayView.lineWidth  = 3; 

     return overlayView; 
    } 

    return nil; 
} 

ध्यान दें, आप अपने वर्ग गुण के किसी भी संदर्भ के लिए की जरूरत नहीं है, के रूप में ओवरले आपके viewForOverlay पर पास हो गया है। यदि आपके पास कभी भी आपके मानचित्र में एकाधिक ओवरले जोड़े गए हैं तो यह थोड़ा अधिक लचीला है।


संयोग से, ये मेरे मानक viewForOverlay (iOS संस्करण से पहले 7.0 के लिए) और rendererForOverlay (आईओएस 7+) कर रहे हैं, जो MKPolygon, MKPolyline, और MKCircle ओवरले संभाल लेंगे:

// for iOS7+; see `viewForOverlay` for earlier versions 

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolygon class]]) 
    { 
     MKPolygonRenderer *renderer = [[MKPolygonRenderer alloc] initWithPolygon:overlay]; 

     renderer.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     renderer.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     renderer.lineWidth = 3; 

     return renderer; 
    } 

    if ([overlay isKindOfClass:[MKCircle class]]) 
    { 
     MKCircleRenderer *renderer = [[MKCircleRenderer alloc] initWithCircle:overlay]; 

     renderer.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     renderer.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     renderer.lineWidth = 3; 

     return renderer; 
    } 

    if ([overlay isKindOfClass:[MKPolyline class]]) 
    { 
     MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay]; 

     renderer.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     renderer.lineWidth = 3; 

     return renderer; 
    } 

    return nil; 
} 

// for iOS versions prior to 7; see `rendererForOverlay` for iOS7 and later 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolygon class]]) 
    { 
     MKPolygonView *overlayView = [[MKPolygonView alloc] initWithPolygon:overlay]; 

     overlayView.fillColor  = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     overlayView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     overlayView.lineWidth  = 3; 

     return overlayView; 
    } 

    if ([overlay isKindOfClass:[MKCircle class]]) 
    { 
     MKCircleView *overlayView = [[MKCircleView alloc] initWithCircle:overlay]; 

     overlayView.fillColor  = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 
     overlayView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     overlayView.lineWidth  = 3; 

     return overlayView; 
    } 

    if ([overlay isKindOfClass:[MKPolyline class]]) 
    { 
     MKPolylineView *overlayView = [[MKPolylineView alloc] initWithPolyline:overlay]; 

     overlayView.strokeColor  = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     overlayView.lineWidth  = 3; 

     return overlayView; 
    } 

    return nil; 
} 

इस तरह से मैं मेरे मानचित्र में इन तीनों प्रकार के ओवरले को जोड़ सकते हैं, और यह उन सभी को ठीक से प्रस्तुत कर सकता है।

1

मुझे एक और तरीका मिला।

यदि आपके पास निर्देशांक सरणी नहीं है तो आप दो पॉलीलाइनों को आकर्षित कर सकते हैं।

अपनी विशिष्ट लाइन 1_विड्थ की पहली पंक्ति बनाएं और उसके बाद लाइन 2_width = line1_width - 1.0 के साथ दूसरी पंक्ति खींचें।

यह दो लाइनों को आकर्षित करेगा, और दूसरी पंक्ति के बाद आप केवल मार्जिन देखेंगे, जो पहली पंक्ति के लिए स्ट्रोक बन जाएगा।

1

हां रॉब का उल्लेख किया गया है, एमकेपोलीगॉन और एमकेपोलीगेंडरर का उपयोग एमकेपोलीलाइन और एमकेपोलीलाइन रेन्डरर के बजाय करें, लेकिन यह भी सुनिश्चित करें कि अंक की आपकी सरणी घड़ी के क्रम में है। यदि यह विपरीत दिशा में है तो आपको सरणी पर रिवर्स() को कॉल करके इसे उलट करने की आवश्यकता होगी।

pointsToUse.reverse() 
let overlay = MKPolygon(coordinates: &pointsToUse, count: pointsToUse.count) 
1
You can do this by implementing your own MKOverlayPathView subclass, which draws the path twice in the map rect. Once thicker with black and once thinner on top with another colour. 

I have created a simple drop-in replacement of MKPolylineView which lets you do that: ASPolylineView. 

- (void)drawMapRect:(MKMapRect)mapRect 
      zoomScale:(MKZoomScale)zoomScale 
      inContext:(CGContextRef)context 
{ 
    UIColor *darker = [UIColor blackColor]; 
    CGFloat baseWidth = self.lineWidth/zoomScale; 

    // draw the dark colour thicker 
    CGContextAddPath(context, self.path); 
    CGContextSetStrokeColorWithColor(context, darker.CGColor); 
    CGContextSetLineWidth(context, baseWidth * 1.5); 
    CGContextSetLineCap(context, self.lineCap); 
    CGContextStrokePath(context); 

    // now draw the stroke color with the regular width 
    CGContextAddPath(context, self.path); 
    CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor); 
    CGContextSetLineWidth(context, baseWidth); 
    CGContextSetLineCap(context, self.lineCap); 
    CGContextStrokePath(context); 

    [super drawMapRect:mapRect zoomScale:zoomScale inContext:context]; 
} 

- (void)createPath 
{ 
    // turn the polyline into a path 

    CGMutablePathRef path = CGPathCreateMutable(); 
    BOOL pathIsEmpty = YES; 

    for (int i = 0; i < self.polyline.pointCount; i++) { 
     CGPoint point = [self pointForMapPoint:self.polyline.points[i]]; 

     if (pathIsEmpty) { 
      CGPathMoveToPoint(path, nil, point.x, point.y); 
      pathIsEmpty = NO; 
     } else { 
      CGPathAddLineToPoint(path, nil, point.x, point.y); 
     } 
    } 

    self.path = path; 
} 

Or you can download code for it from below link 
https://github.com/nighthawk/ASPolylineView 

I have used it and have a look on this screen shot. 

Border color of polyline