Objective c 当mapoverlay可见时隐藏mapview ios7

Objective c 当mapoverlay可见时隐藏mapview ios7,objective-c,ios7,mkmapview,mapkit,mkoverlay,Objective C,Ios7,Mkmapview,Mapkit,Mkoverlay,在iOS7中,当地图视图顶部有一个覆盖图时,如何隐藏地图视图?这段代码过去在iOS6中工作,但当我将应用程序升级到iOS7时,它就停止工作了 NSArray *views = [[[self.mapView subviews] objectAtIndex:0] subviews]; [[views objectAtIndex:0] setHidden:YES]; 有什么建议或反馈吗?我不知道您为什么要这样做,但您不应该计算子视图的数量,而应该询问mapView的覆盖图数量 if ([[map

在iOS7中,当地图视图顶部有一个覆盖图时,如何隐藏地图视图?这段代码过去在iOS6中工作,但当我将应用程序升级到iOS7时,它就停止工作了

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

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

有什么建议或反馈吗?

我不知道您为什么要这样做,但您不应该计算子视图的数量,而应该询问mapView的覆盖图数量

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

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

两个想法:

  • 考虑使用新的iOS 7
    MKTileOverlay
    类以及
    canReplaceMapContent
    属性。这会关闭苹果的基础地图

  • 考虑一个类似但独立的库,例如,它可以模拟MapKit的外观,但在样式设置方面具有更大的灵活性(还支持返回到iOS 5)


  • 正如Ingaus在
    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;
    }
    
    MKOverlay
    协议需要
    boundingMapRect:
    ,该协议应为该覆盖覆盖的矩形区域返回MKMapRect。然而,我个人发现,如果我自己重写它,它会使先前的
    canReplaceMapContent=YES
    设置无效,因为苹果可能不喜欢显示空白的灰色地图。所以我让MKTileMapOverlay来处理它


    如果覆盖层实际上不是平铺,那么MKTileOverlay实际上并不适用。但我认为您可能可以伪造它,但总是在
    loadTileAtPath:result:
    中报告零数据,并通过另一个覆盖添加真正的覆盖。另一种选择是只覆盖整个世界,但是毫无戒心的用户可能会在不知不觉中传输比他/她喜欢的更多的数据。

    i如果有覆盖,我会试图隐藏基础地图。啊,这与“隐藏地图视图”不同。有没有一种方法可以不用MapBox来做到这一点?我需要删除基础地图背景,只显示我的覆盖。或者显示包含覆盖的地图区域,不要超过该区域。按照@incaus所说的,实现您自己的MKTileOverlay。将其设置为替换地图内容并始终返回相同的空白图像。您能给我举个例子说明如何使用MKTileOverlay以及如何返回相同的空白图像吗?我找不到任何关于如何做到这一点的好例子。非常感谢Craig。顺便说一句,我发现canReplaceMapContent有时仍然会显示Apple地图。这可能发生在实现自定义MKTileOverlay时,它返回boundingMapRect,我不知道这是否重要,但与世界地图相比,它是一个非常小的区域。在这种情况下,仍会显示覆盖未覆盖的地图区域。
    -(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]);
        }
    }