インカヌスが で言ったMKTileOverlay
ことで、View Controller では次のようになります。
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *tileTemplate = @"http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg";
MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:tileTemplate];
overlay.canReplaceMapContent = YES;
[self.mapView addOverlay:overlay];
[self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(37.54827, -121.98857)];
self.mapView.delegate = self;
}
-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithOverlay:overlay];
return renderer;
}
オーバーレイがデータをフィードする方法を制御する必要がある場合は、サブクラス化MKTileOverlay
してオーバーライドする必要がありますloadTileAtPath:result:
-(void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData *, NSError *))result
{
NSData *tile = [self someHowGetTileImageIntoNSDataBaseOnPath:path];
if (tile) {
result(tile, nil);
} else {
result(nil, [NSError errorWithDomain: CUSTOM_ERROR_DOMAIN code: 1 userInfo:nil]);
}
}
このMKOverlay
プロトコルはboundingMapRect:
、このオーバーレイがカバーする四角形の領域に対して MKMapRect を返す必要がある を必要とします。canReplaceMapContent = YES
ただし、 Apple は空白の灰色の地図を表示することをおそらく好まないため、自分で上書きすると以前の設定が無効になることが個人的にわかりました。そのため、代わりに MKTileMapOverlay に処理させました。
オーバーレイが実際にはタイルでない場合、MKTileOverlay は実際には適用されません。しかし、おそらくそれを偽造できると思いますが、常に 内loadTileAtPath:result:
で nil データを報告し、別のオーバーレイを介して実際のオーバーレイを追加します。もう 1 つのオプションは、全世界を黒いポリゴン オーバーレイでカバーすることですが、そうすると、無防備なユーザーが無意識のうちに自分の好みよりも多くのデータをストリーミングしている可能性があります。