从父级中删除mapView,然后稍后再添加

时间:2014-02-18 01:12:54

标签: ios mkmapview mapkit

我正在尝试从父视图中删除我的地图视图,然后在某个时候将其添加回来:

- (IBAction)setMapType:(UISegmentedControl *)sender {
    switch (sender.selectedSegmentIndex) {
        case 0: {
            if ([self.mapView isDescendantOfView:self.view] == false) {
                [self.view insertSubview:self.mapView atIndex:0];
            }

            break;
        }

        case 1:
            [self.mapView removeFromSuperview];
            break;
    }
}

当我单击分段控件中的第二个按钮时,mapview会被删除。但是,当我单击第一个按钮时,它似乎没有正确添加回来。我的意思是它确实被添加回父视图,但地图不会出现。我尝试将其添加到子视图的顶部,并将底部添加到相同的结果中。

你可能会问为什么我会这样做(因为我在问自己)。我试图让我的用户能够指向不同的地图类型(iOS除外)。 MKMapView将指向iOS地图,这是很棒的但我想投入RMMapView(mapbox / routeme)地图视图。我不确定交换进出这样的地图视图的最佳方法是什么。我应该删除交换上的旧地图视图并创建新闻视图吗?或者我应该保留旧的地图视图,但只是从视图中删除它们?

2 个答案:

答案 0 :(得分:1)

  

我的意思是它确实被添加回父视图但是地图没有出现。

这确实很奇怪,不应该发生。

关于方法,我建议在首次使用每个地图视图时保留对两个地图视图的强引用,然后每次删除未使用的地图视图,释放/ nil它,并释放内存。然后,下次需要时,使用相同的样式,中心和缩放级别重新创建它。对于MapKit,可能更容易用region而不是缩放来思考,但是,

答案 1 :(得分:1)

我想你可能会在其他现有的子视图下添加subView?指数越低,z指数越低。尝试使用addSubView:相反,它将subView插入到每个其他子视图上方:

[self.view addSubview:self.mapView];

或:

[self.view insertSubview:self.mapView atIndex:[self.view.subviews count]];

或添加后只需将其发送到前面:

[self.view bringSubviewToFront:self.mapView];

我个人会保留mapViews并根据需要添加/删除它们到超级视图。另一种可能的方法是将它们保持在超级视图中,并在选定的段索引发生更改时切换其隐藏属性。