マップに複数のオーバーレイが追加されている場合、カスタムMKOverlayViewと標準MKPolygonViewの両方が特定のズームレベルでクリップされる問題が発生します。カスタムMKOverlayView /未修正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を返すかどうかの発生します。
- オーバーレイを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に関するさまざまな例を書いてきましたが、自分のマップタイルをロードしていないので、あまり役に立ちません。
私はおそらく何かが痛いほど分かりません。どんな助けもありがとう。必要に応じてより多くのコード/コンテキストを提供できることを嬉しく思います。