マップに複数のオーバーレイが追加されている場合、カスタム MKOverlayView と標準 MKPolygonView の両方が特定のズーム レベルでクリップされるという問題があります。
2 回ダブルタップ ズーム レベルでのアルジェリアのオーバーレイ。
3 回ダブルタップ ズーム レベルでのアルジェリアのオーバーレイ。クリッピングに注意してください。
いくつかの観察:
- これは、カスタム MKOverlayView を使用するかどうか、または同じポリゴンで MKPolygonView を返すかに関係なく発生します。
- オーバーレイを 1 つだけ描画すると、この問題は発生しません。
- これはすべてのオーバーレイで発生するわけではなく、一部のオーバーレイでのみ発生します。
コードに関する限り、これはオーバーレイを NSMutableArray (borderOverlays) に追加し、特定の国 ID のオーバーレイをロードするために別の場所にアクセスします。minX/minY/maxX/maxY は緯度/経度の値です。ポリゴンは、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];
オーバーレイは、次の方法でマップに追加されます。
[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;
}
}
MKPolygonView を使用する場合、描画コードはありません (表示例)。ただし、完成のために、ここに私のカスタム描画コードを示しますが、同じ問題が発生します。アウトラインは通常描画します - これは実際にはデバッグ描画であり、オーバーレイのboundingMapRectの周りに四角形を描画し、アウトラインをいじらずに塗りつぶします。
- (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);
}
私はこの時点で少し困惑しています - ロードされているズームされたタイルがオーバーレイ上に描画されているかのようです。TileMap と HazardMap に関するさまざまな例を示しましたが、独自のマップ タイルを読み込んでいないため、あまり役に立ちません。
私はおそらく痛々しいほど明らかな何かを見逃しています。どんな助けでも大歓迎です。必要に応じて、より多くのコード/コンテキストを提供させていただきます。