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

时间:2009-10-26 00:45:10

标签: iphone overlay mkmapview subview

对于我正在构建的应用,我有一个自定义的“旧地图”效果PNG,我想在MKMapView视图上叠加。不幸的是,我试图做到这一点的方式都不正确:

  1. 将子视图添加到MKMapView(问题:PNG的UIImageView被放置在上面注释引脚,看起来很奇怪
  2. 使图像成为注释视图本身并将其置于其他视图之下(问题:在滚动时,我必须移动注释视图图像,并且暂时只有常规地图而不是旧时效果)
  3. 我基本上想要完成的是一个子视图,它位于maptiles上方,但在注释视图下方,并且在用户滚动时会保持稳定 - 任何想法?

3 个答案:

答案 0 :(得分:4)

请注意,所有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];
    }
}

此代码可以实现您想要的一半 - 您可以在地图图块和注释之间放置视图。剩下的任务是根据地图滚动/缩放来更改自定义叠加视图框(如果找到方法,我会发布)。

答案 1 :(得分:1)

我最后做了类似的事情并以不同的方式。我想通过添加白色叠加来淡化mapview,但我并不想淡化注释。我在地图上添加了一个叠加层(实际上我必须添加两个,因为它并不像我尝试为整个地球添加叠加层一样)。

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;
}

答案 2 :(得分:0)

它已经很老了,但对于你们中的一些人来说可能仍然相关。

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

我做的很简单,我还不知道它是否有一些后备......

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

- (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.viewDark&#39; autoresizesSubviews设置为NO