iOS7 でマップビューの上にオーバーレイがある場合、マップビューを非表示にするにはどうすればよいですか? このコード スニペットは iOS6 で動作していましたが、アプリを iOS7 にアップグレードすると動作しなくなります。
NSArray *views = [[[self.mapView subviews] objectAtIndex:0] subviews];
[[views objectAtIndex:0] setHidden:YES];
提案やフィードバックはありますか?
iOS7 でマップビューの上にオーバーレイがある場合、マップビューを非表示にするにはどうすればよいですか? このコード スニペットは iOS6 で動作していましたが、アプリを iOS7 にアップグレードすると動作しなくなります。
NSArray *views = [[[self.mapView subviews] objectAtIndex:0] subviews];
[[views objectAtIndex:0] setHidden:YES];
提案やフィードバックはありますか?
インカヌスが で言った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 つのオプションは、全世界を黒いポリゴン オーバーレイでカバーすることですが、そうすると、無防備なユーザーが無意識のうちに自分の好みよりも多くのデータをストリーミングしている可能性があります。
MapKit は、真のオーバーレイの外側にあるマップ ビューのサブビューに直接アクセスするようには実際には設計されていません (たとえば、下にある Apple のマップをオフにするなど)。
2 つのアイデア:
プロパティMKTileOverlayと共に新しい iOS 7 クラスを使用することを検討してください。canReplaceMapContentこれには、Apple の基になるマップをオフにする効果があります。
MapKitの外観をエミュレートできますが、スタイリングの柔軟性が高い (また、iOS 5 までサポートする) MapBox iOS SDKなど、類似しているが別のライブラリを検討してください。