当iOS7中的mapview顶部有叠加层时,如何隐藏mapview?这段代码曾经在iOS6中运行,但是当我将我的应用程序升级到iOS7时,它停止工作。
NSArray *views = [[[self.mapView subviews] objectAtIndex:0] subviews];
[[views objectAtIndex:0] setHidden:YES];
有任何建议或反馈吗?
答案 0 :(得分:2)
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:
内的无数据,并通过另一个叠加层添加你的真实叠加层。另一种选择只是用black polygon overlay覆盖整个世界,但毫无疑问的用户可能会在不知不觉中传输比他/她喜欢的数据更多的数据。
答案 1 :(得分:1)
MapKit并非真正设计用于直接访问真实叠加层之外的地图视图子视图(例如,关闭Apple下方的地图)。
两个想法:
考虑使用新的iOS 7 MKTileOverlay
类以及canReplaceMapContent
属性。这具有关闭Apple底层地图的效果。
考虑一个类似但独立的库,例如MapBox iOS SDK,它可以模仿MapKit的外观,但具有更大的样式灵活性(并且还支持iOS 5)。
答案 2 :(得分:0)
我不知道您为什么要这样做,但不是要计算子视图的数量,您应该只询问mapView的叠加数量
if ([[mapView overlays] count] > 0)
{
....
}