当我在 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];
有什么建议或反馈吗?
用 incanus 所说的MKTileOverlay
,在视图控制器中是这样的:
- (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:
,并通过另一个叠加层添加您的真实叠加层。另一种选择是用黑色多边形覆盖覆盖整个世界,但是毫无戒心的用户可能会在不知不觉中传输比他/她喜欢的更多的数据。
MapKit 并不是真正为直接访问真正覆盖之外的地图视图子视图而设计的(例如,关闭下面的 Apple 地图)。
两个想法:
考虑将新的 iOS 7MKTileOverlay
类与canReplaceMapContent
属性一起使用。这具有关闭 Apple 底层地图的效果。
考虑一个类似但独立的库,例如MapBox iOS SDK,它可以模拟 MapKit 的外观,但具有更大的样式灵活性(并且还支持回 iOS 5)。
我不知道您为什么要这样做,但是您不应该计算子视图的数量,而应该只向 mapView 询问它具有的叠加层数
if ([[mapView overlays] count] > 0)
{
....
}