2012-10-12 29 views
5

Tôi gặp sự cố với cả tùy chỉnh MKOverlayView và MKPolygonView chuẩn bị cắt bớt ở các mức thu phóng nhất định khi có nhiều lớp phủ được thêm vào bản đồ.Tùy chỉnh MKOverlayView/MKPolygonView chưa sửa đổi được cắt bớt ở các mức thu phóng nhất định

The overlay of Algeria at two double tap zoom level.

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

Một vài quan sát:

  • này xảy ra bất kể có hay không tôi sử dụng một MKOverlayView tùy chỉnh hoặc trả lại một MKPolygonView với đa giác tương tự.
  • Nếu tôi chỉ vẽ một lớp phủ, vấn đề này không xảy ra.
  • Điều này không xảy ra đối với tất cả các lớp phủ - chỉ một số.

Theo như mã đi: điều này thêm lớp phủ vào NSMutableArray (borderOverlays), sau đó được truy cập ở nơi khác để tải lớp phủ cho ID quốc gia cụ thể. minX/minY/maxX/maxY là các giá trị vĩ độ/kinh độ; đa giác là một đường dẫn được xây dựng từ một shapefile ESRI.

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

Lớp phủ được thêm vào bản đồ qua:

[mapView addOverlay:overlay]; 

viewForOverlay:

- (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; 
    } 
} 

Khi MKPolygonView được sử dụng, không có mã vẽ (ví dụ thể hiện). Vì lợi ích của hoàn thành, mặc dù, đây là mã vẽ tùy chỉnh của tôi, và cùng một vấn đề xảy ra. Các phác thảo thường vẽ - đây là thực sự gỡ lỗi vẽ, mà vẽ một rect xung quanh boundingMapRect của lớp phủ và lấp đầy nó mà không mucking xung quanh với các phác thảo.

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

Đủ để nói, tôi hơi bối rối vào thời điểm này - gần như là lát gạch thu phóng đang được tải trên lớp phủ. Tôi đã đổ qua các ví dụ khác nhau liên quan đến TileMap và HazardMap, nhưng khi tôi không tải các lát bản đồ của riêng mình, chúng không hữu ích lắm.

Có thể tôi đang thiếu điều gì đó rõ ràng. Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi rất vui khi cung cấp thêm mã/ngữ cảnh nếu cần.

Trả lời

3

Nó sẽ xuất hiện rằng thủ phạm là:

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

Bao quanh các khối hình chữ nhật cho MKOverlays rõ ràng cần phải được dựa trên phía tây bắc/tọa độ phía đông nam của vùng bounding, và không phải về phía tây nam/đông bắc (đó là định dạng ESRI shapefile lưu trữ các tọa độ giới hạn của nó trong). Thay đổi mã vi phạm thành:

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

Xuất hiện để giải quyết mọi vấn đề về phóng to và bất thường phác thảo lạ. Tôi hy vọng điều này sẽ giúp bất cứ ai gặp vấn đề này trong tương lai (và tôi muốn nghe về nó nếu nó không, vì giải pháp này làm việc một điều trị cho tôi).

Ngoài ra: nếu có ai có thể trỏ đến bất kỳ tài liệu nào nêu rõ điều này, tôi muốn xem nó.

Các vấn đề liên quan