2012-10-12 10 views
5

पर क्लिप किया गया है, मुझे एक कस्टम MKOverlayView और मानक MKPolygonView को कुछ ज़ूम स्तरों पर क्लिप किया जा रहा है जब मानचित्र में एकाधिक ओवरले जोड़े जाते हैं।कस्टम MKOverlayView/unmodified MKPolygonView को कुछ ज़ूम स्तर

The overlay of Algeria at two double tap zoom level.

The overlay of Algeria at three double tap zoom level. Note the clipping.

कुछ टिप्पणियों:

  • यह है या नहीं, मैं एक कस्टम MKOverlayView का उपयोग करें या एक ही बहुभुज के साथ एक MKPolygonView वापसी की परवाह किए बिना होता है।
  • यदि मैं केवल एक ओवरले खींचता हूं, तो यह समस्या नहीं होती है।
  • यह सभी ओवरले के लिए नहीं होता है - केवल कुछ।

जहां तक ​​कोड जाता है: यह ओवरले को एनएसएमयूटेबलएरे (सीमावर्ती ओवरलेज़) में जोड़ता है, जिसे किसी विशिष्ट देश आईडी के लिए ओवरले लोड करने के लिए कहीं और एक्सेस किया जाता है। minX/minY/maxX/maxY अक्षांश/देशांतर मान हैं; बहुभुज एक ईएसआरआई आकारफाइल से निर्मित एक रास्ता है।

[mapView addOverlay:overlay]; 

viewForOverlay:

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX); 
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX); 
MKMapPoint minPoint = MKMapPointForCoordinate(mbrMin); 
MKMapPoint maxPoint = MKMapPointForCoordinate(mbrMax); 
MKMapSize size = MKMapSizeMake(maxPoint.x - minPoint.x, maxPoint.y - minPoint.y); 
MKMapRect rect = MKMapRectMake(minPoint.x, minPoint.y, size.width, size.height); 

if (spans180) { 
    rect = MKMapRectMake(minPoint.x, minPoint.y, MKMapSizeWorld.width * 2, size.height); 
} 

CustomMKOverlay* overlay = [[CustomMKOverlay alloc] initWithPolygon:polygon withBoundingMapRect:rect]; 
[borderOverlays addObject:overlay]; 

ओवरले के माध्यम से मानचित्र में जोड़े

- (MKOverlayView *)mapView:(MKMapView*)aMapView viewForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[CustomMKOverlay class]]) { 
     /* Note: the behaviour if this chunk is not commented is the exact same as below. 
     CustomMKOverlayView* overlayView = [[[CustomMKOverlayView alloc] initWithOverlay:overlay withMapView:aMapView] autorelease]; 
     [borderViews addObject:overlayView]; 
     return overlayView; */ 

     MKPolygonView* view = [[[MKPolygonView alloc] initWithPolygon:((CustomMKOverlay*)overlay).polygon] autorelease]; 
     view.fillColor = [((CustomMKOverlay*)overlay).colour colorWithAlphaComponent:0.5f]; 
     view.lineWidth = 5.0f; 
     view.strokeColor = [UIColor blackColor]; 
     [borderViews addObject:view]; 
     return view; 
    } 
} 

जब MKPolygonView प्रयोग किया जाता है, वहाँ कोई ड्राइंग कोड (उदाहरण दिखाया गया है) है। पूरा होने के लिए, हालांकि, मेरा कस्टम ड्राइंग कोड यहां है, और एक ही समस्या होती है। रूपरेखा आम तौर पर आकर्षित करती है - यह वास्तव में डिबगिंग ड्राइंग है, जो ओवरले के बाउंडिंग मैपरेक्ट के चारों ओर एक रेक्ट खींचती है और रूपरेखाओं के साथ मिलकर बिना इसे भर देती है।

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{  
    CustomMKOverlay* overlay = (CustomMKOverlay*)self.overlay; 

    CGRect clipRect = [self rectForMapRect:overlay.boundingMapRect]; 
    CGContextAddRect(context, clipRect); 
    CGContextClip(context); 

    UIColor* colour = [UIColor redColor]; 
    colour = [colour colorWithAlphaComponent:0.5f]; 
    CGContextSetFillColorWithColor(context, [colour CGColor]); 
    CGRect fillRect = [self rectForMapRect:overlay.boundingMapRect]; 
    CGContextFillRect(context, fillRect); 
} 

पर्याप्त कहने के लिए, मैं थोड़ा इस बिंदु पर स्टम्प्ड हूँ - यह लगभग रूप में अगर ज़ूम टाइलों कि लोड किया जा रहा है ओवरले के ऊपर खींचता है। मैंने टाइल मैप और हैज़ार्डैप के संबंध में विभिन्न उदाहरणों को डाला है, लेकिन जैसा कि मैं अपना खुद का नक्शा टाइल्स लोड नहीं कर रहा हूं, वे बहुत उपयोगी नहीं हैं।

मुझे शायद कुछ दर्दनाक स्पष्ट रूप से याद आ रही है। किसी भी सहायता की सराहना की जाएगी। यदि आवश्यक हो तो मुझे अधिक कोड/संदर्भ प्रदान करने में खुशी होगी।

उत्तर

3

ऐसा लगता है कि दोषी है:

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(minY, minX); 
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(maxY, maxX); 

MKOverlays के लिए आयतों Bounding जाहिरा तौर पर बाउंडिंग क्षेत्र के उत्तर-पश्चिम/दक्षिण पूर्व निर्देशांक के आधार पर किए जाने की जरूरत है, और दक्षिण पश्चिम नहीं/उत्तर पूर्व (जो स्वरूप है ईएसआरआई आकारफाइल अपने बाध्यकारी निर्देशांक स्टोर करता है)। अपमानजनक कोड को बदलना:

CLLocationCoordinate2D mbrMin = CLLocationCoordinate2DMake(maxY, minX); 
CLLocationCoordinate2D mbrMax = CLLocationCoordinate2DMake(minY, maxX); 

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

इसके अलावा: यदि कोई भी इस दस्तावेज को इंगित कर सकता है, तो मैं इसे देखना चाहता हूं।