2011-10-14 16 views
9

मैं मार्ग दिखाने के लिए MKMapView पर खींची गई रेखाओं को कस्टमाइज़ करना चाहता हूं ताकि लाइनों के पास सीमा रंग और भरने का रंग हो।विभिन्न स्टाइल लाइनों को आकर्षित करने के लिए MKPolyLineView को कस्टमाइज़ करने के लिए कैसे करें

blue line with black border

मैं कर रहा हूँ वर्तमान में सिर्फ MKPolyLineView लौटने mapView:viewForOverlay: जो सादा लाइनों के लिए ठीक काम करता है से वस्तुओं: इस जहां यह एक काले रंग की सीमा है और एक अन्य रंग से भर जाता है के समान है। दस्तावेज़ों का कहना है कि MKPolyLineView को उप-वर्गीकृत नहीं किया जाना चाहिए, तो क्या मुझे MKOverlayView को उपclass करना चाहिए और अपना खुद का drawMapRect लागू करना चाहिए? या मुझे MKOverlayPathView subclass करना चाहिए? या MKPolylineView के लिए एक प्रतिस्थापन बनाएँ?

संपादित करें - मैं जो पूछ रहा हूं वह है: अपनी खुद की एनोटेशन/ओवरले आकर्षित करने के लिए अपना खुद का क्वार्ट्ज ड्राइंग कोड कहां रखा जाए? वर्तमान में मैंने MKOverlayView का उप-वर्ग बनाया है और अपना खुद का drawMapRect लागू किया है: ज़ूमस्केले: इनकॉन्टेक्स्ट: ओवरले को इस तरह खींचना बहुत आसान है लेकिन क्या यह सबसे अच्छा समाधान है?

उत्तर

12

आप अपने स्वयं के एमकेओवरलेपाथ व्यू सबक्लास को कार्यान्वित करके ऐसा कर सकते हैं, जो नक्शा रेक्ट में पथ को दो बार खींचता है। एक बार काले रंग के साथ मोटा हो जाता है और एक बार दूसरे रंग के साथ पतला होता है।

मैंने एमकेपोलीलाइन व्यू के एक साधारण ड्रॉप-इन प्रतिस्थापन को बनाया है जो आपको यह करने देता है: 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; 
} 
1

मुझे पता है कि यह आपके इच्छित शुद्ध दृष्टिकोण से मेल नहीं खा सकता है, लेकिन के बजाय MKPolygon का उपयोग क्यों नहीं कर रहा है?
एक MKPolygon उदाहरण है कि अपने मार्ग आसपास गलियारे का एक प्रकार का प्रतिनिधित्व करता है बनाएँ, और तब, जब आप MKPolygonView कि MKPolygon/गलियारे आपके द्वारा बनाया गया से मेल खाती है बनाने के लिए, एक अलग पाने के लिए MKPolygonView के गुण सेट रंग और स्ट्रोक भरें रंग

myPolygonView.lineWidth=3; 
    myPolygonView.fillColor=[UIColor blueColor]; 
    myPolygonView.strokeColor=[UIColor darkGrayColor]; 

मैंने इसे स्वयं नहीं किया लेकिन यह काम करना चाहिए। केवल दोष यह है कि जब आप ज़ूम इन/आउट करते हैं, तो 'मार्ग' की 'चौड़ाई' बदल जाएगी ....:/

+0

अच्छा विचार है, लेकिन से बहुभुज की सीमा की गणना मार्ग निर्देशांक का एक मनमाने ढंग से सेट बहुत जटिल है – progrmr

+0

गलियारे के ऊपरी भाग के लिए अक्षांश में 0.000001 जोड़ने के लिए मूल दृष्टिकोण हो सकता है, फिर -0.000001 निचले हिस्से के लिए, और उसके बाद ऊपरी और निचले हिस्से से बना बहुभुज के साथ एक गलियारा बनाना भागों ... बस एक विचार ... – yonel

+0

यह केवल तभी काम करेगा जब मार्ग पूर्व/पश्चिम दिशा में चलता है। ये किसी भी दिशा में चल सकते हैं ताकि पॉलीगॉन को प्रत्येक लाइन सेगमेंट के शीर्षक पर आधारित होना आवश्यक हो। पक्ष को मार्ग शीर्षक के दाहिने कोणों पर होना चाहिए और लेट/लॉन जोड़ी से [गोलाकार कानून के कोसाइन लॉ] का उपयोग करके शीर्षक की गणना करना होगा (http://stackoverflow.com/questions/6924742/valid-way-to- गणना-कोण-बीच-2-क्ल्लोकेशंस/7352235 # 7352235) एक महंगा ऑपरेशन है। – progrmr

4

आप केवल दो एमकेपोलीलाइन व्यू ऑब्जेक्ट्स को एक ही निर्देशांक के साथ जोड़ सकते हैं, लेकिन विभिन्न मोटाई।

स्ट्रोक के साथ 10 (या जो कुछ भी) लाइन के साथ एक जोड़ें जोड़ें रंग काला पर सेट करें।

फिर स्ट्रोक रंग के साथ 6 लाइन की एक पंक्ति के साथ एक और जोड़ें अपने अन्य वांछित रंग में सेट करें।

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

+0

हम्म, अच्छा विचार, बस यह सुनिश्चित करना है कि व्यापक पॉलीलाइन पतली पॉलीलाइन के नीचे है। – progrmr

+0

अच्छा विचार, शायद आप पतले पॉलीलाइन को व्यापक के सबव्यू के रूप में जोड़ सकते हैं? चूंकि MKPolyLineView UIView से फैला है, यह सिद्धांत में संभव है .... – yonel

+0

आप ऐसा कर सकते हैं, लेकिन फिर आपको सबव्यू के लिए निर्देशांक ऑफ़सेट करना होगा, जिसका अर्थ है एमकेपोलीलाइन साझा नहीं करना। यदि आप उन्हें एक साथ बदलना चाहते हैं तो उन्हें माता-पिता UIView ऑब्जेक्ट के दोनों बच्चे बनाने के लिए बेहतर है। – MindJuice

2

MKPolylineView का उपयोग केवल निर्दिष्ट पथ का पथन करने के लिए किया जा सकता है। आप अपनी उपस्थिति बदलने के लिए MKOverlayPathView में कुछ गुणों का उपयोग कर सकते हैं लेकिन उनमें से कुछ केवल लागू होंगे, उदाहरण के लिए fillColor, strokeColor

यदि आप कुछ और जटिल बनाना चाहते हैं, तो आप MKOverlayPathView का उपयोग कर सकते हैं। यह अधिक सामान्य है और इस प्रकार केवल पथ पथ से अधिक के लिए अनुकूल है। सरल रेखाओं को चित्रित करने के लिए, परिणाम MKPolylineView (कम से कम, दस्तावेज़ों के अनुसार) के समान होगा।

यदि आप अधिक जटिल ड्राइंग करना चाहते हैं, तो उपclass MKOverlayPathView। आप जो करने की कोशिश कर रहे हैं वह गैर-तुच्छ है।

2

मैं एक उपवर्ग NamedOverlay कि एक उपरिशायी एक एक नाम रखती है का उपयोग करें:

NamedOverlay.h

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface NamedOverlay : NSObject <MKOverlay> 

@property (strong, readonly, nonatomic) NSString *name; 
@property (strong, readonly, nonatomic) id<MKOverlay> overlay; 

-(id)initWithOverlay:(id<MKOverlay>)overlay andName:(NSString *)name; 

@end 

NamedOverlay.m

#import "NamedOverlay.h" 

@implementation NamedOverlay 

- (id)initWithOverlay:(id<MKOverlay>)overlay andName:(NSString *)name 
{ 
    _name = name; 
    _overlay = overlay; 
    return self; 
} 

- (MKMapRect)boundingMapRect 
{ 
    return [_overlay boundingMapRect]; 
} 

- (CLLocationCoordinate2D)coordinate 
{ 
    return [_overlay coordinate]; 
} 

-(BOOL)intersectsMapRect:(MKMapRect)mapRect 
{ 
    return [_overlay intersectsMapRect:mapRect]; 
} 

@end 

और नक्शा नियंत्रक में मैं अलग नाम के साथ दो ओवरले, तो MKMapViewDelegate में मैं पहचान कर सकते हैं, जिससे ओवरले मैं आकर्षित करने के लिए करना चाहते हैं और की तरह कुछ करने का दृष्टांत:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    NamedOverlay *namedOverlay = (NamedOverlay *) overlay; 
    MKPolyline *polyline = namedOverlay.overlay; 
    if ([namedOverlay.name isEqualToString:@"top"]) { 
     MKPolylineView *view1 = [[MKPolylineView alloc] initWithOverlay:polyline]; 
     view1.strokeColor = [UIColor whiteColor]; 
     view1.lineWidth = 25.0; 
     return view1; 
    } else { 
     MKPolylineView *view1 = [[MKPolylineView alloc] initWithOverlay:polyline]; 
     view1.strokeColor = [UIColor blueColor]; 
     view1.lineWidth = 15.0; 
     return view1; 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे