当mapoverlay可见ios7时隐藏mapview

时间:2013-10-27 01:48:51

标签: objective-c ios7 mkmapview mapkit mkoverlay

当iOS7中的mapview顶部有叠加层时,如何隐藏mapview?这段代码曾经在iOS6中运行,但是当我将我的应用程序升级到iOS7时,它停止工作。

NSArray *views = [[[self.mapView subviews] objectAtIndex:0] subviews];

[[views objectAtIndex:0] setHidden:YES];

有任何建议或反馈吗?

3 个答案:

答案 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下方的地图)。

两个想法:

  1. 考虑使用新的iOS 7 MKTileOverlay类以及canReplaceMapContent属性。这具有关闭Apple底层地图的效果。

  2. 考虑一个类似但独立的库,例如MapBox iOS SDK,它可以模仿MapKit的外观,但具有更大的样式灵活性(并且还支持iOS 5)。

答案 2 :(得分:0)

我不知道您为什么要这样做,但不是要计算子视图的数量,您应该只询问mapView的叠加数量

if ([[mapView overlays] count] > 0)
{
    ....
}