将子视图添加到MKMapView上方但在注释视图下方?

19
为了我正在构建的应用程序,我有一个自定义的“旧地图”效果PNG文件,我希望将其叠加在MKMapView上。不幸的是,我尝试过两种方法,但都不完全正确:
  1. 向MKMapView添加子视图(问题:PNG的UIImageView位于注释标记之上,看起来很奇怪)。
  2. 将图像作为注释视图本身,并将其放置在其他注释视图下面(问题:在滚动时,我必须移动注释视图图像,一段时间内只会出现常规地图而不是老式效果)。
基本上我的目标是具有一个子视图,该视图在地图瓷砖之上但在注释视图之下,当用户滚动时保持稳定 - 你有什么想法吗?

3
哇,古老的问题竟然没有答案。我点个赞因为我也需要这个答案。 - bentford
有人解决了这个问题吗? - horseshoe7
3个回答

5
请注意,所有的MKMapView子视图层次结构、注释、行为等都在内部私有的MKMapViewInternal类中进行,因此以我建议的方式或其他方式更改这个结构中的任何内容可能会导致您的应用程序被Appstore拒绝。

我没有完整的解决方案,只有一个想法。我的想法是使覆盖视图具有与注释视图相同的父视图,并确保注释将放置在我们的覆盖上方。在MKMapViewDelegate中,我们实现:
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
    if (views.count > 0){
        UIView* tView = [views objectAtIndex:0];

        UIView* parView = [tView superview];
        UIView* overlay = [tView viewWithTag:2000];
        if (overlay == nil){
            overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MY_IMAGE_NAME]];
            overlay.frame = parView.frame; //frame equals to (0,0,16384,16384)
            overlay.tag = 2000;
            overlay.alpha = 0.7;
            [parView addSubview:overlay];
            [overlay release];
        }

        for (UIView* view in views)
            [parView bringSubviewToFront:view];
    }
}

这段代码只完成了你想要的一半 - 你得到了一个位于地图瓦片和注释之间的视图。剩下的任务是根据地图滚动/缩放更改自定义覆盖视图的框架(如果我找到方法,我会发布)。

很好的答案,这也适用于我们想在地图上叠加渐变色但希望标记突出的情况。 - John Stricker

1
我最终做了类似的事情,但方式不同。我想通过添加一个白色遮罩来淡化地图视图,但我不想淡化注释。我在地图上添加了一个覆盖层(实际上我必须添加两个,因为它不喜欢我尝试为整个地球添加覆盖层)。
CLLocationCoordinate2D pt1, pt2, pt3, pt4;
pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, 180);
pt3 = CLLocationCoordinate2DMake(-85, 180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords[] = {pt1, pt2, pt3, pt4};
MKPolygon *p = [MKPolygon polygonWithCoordinates:coords count:4];
[self.mapView addOverlay:p];

pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, -180);
pt3 = CLLocationCoordinate2DMake(-85, -180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords2[] = {pt1, pt2, pt3, pt4};
MKPolygon *p2 = [MKPolygon polygonWithCoordinates:coords2 count:4];
[self.mapView addOverlay:p2];

然后您需要添加地图委托来绘制它们:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
    if ([overlay isKindOfClass:MKPolygon.class]) {
        MKPolygonRenderer *polygonView = [[MKPolygonRenderer alloc] initWithOverlay:overlay];
        polygonView.fillColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.4];
        return polygonView;
    }
    return nil;
}

0

这可能有些老了,但对于你们中的一些人可能仍然相关。

我想让地图变暗,但不是注释视图。

我所做的非常简单,我还不知道它是否有一些后备方案...

我在MKMapView上面放了一个带有黑色透明背景的UIView,然后添加了以下代码:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views
{
    for (MKAnnotationView *view in views) {
        view.center = [self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
        [self.viewDark addSubview:view];
    }
}

希望能对你有所帮助..当然,如果你发现这个解决方案有任何问题,请告诉我 :)

编辑 #1: 忘记提到self.viewDark应该禁用userInteraction

编辑 #2: 另一件对我有帮助的事情是将self.viewDarkautoresizesSubviews设置为NO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接