1

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

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

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

有什么建议或反馈吗?

4

3 回答 3

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:,并通过另一个叠加层添加您的真实叠加层。另一种选择是用黑色多边形覆盖覆盖整个世界,但是毫无戒心的用户可能会在不知不觉中传输比他/她喜欢的更多的数据。

于 2013-11-05T05:00:57.790 回答
1

MapKit 并不是真正为直接访问真正覆盖之外的地图视图子视图而设计的(例如,关闭下面的 Apple 地图)。

两个想法:

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

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

于 2013-10-28T17:57:51.243 回答
0

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

if ([[mapView overlays] count] > 0)
{
    ....
}
于 2013-10-27T20:37:16.517 回答