19

对于我正在构建的应用程序,我有一个自定义的“旧地图”效果 PNG,我想覆盖在 MKMapView 视图上。不幸的是,我尝试过的这两种方法都不完全正确:

  1. 向 MKMapView 添加一个子视图(问题:PNG 的 UIImageView 被放置在注释引脚上方,这看起来很奇怪
  2. 使图像本身成为注释视图并将其放置在其他视图下方(问题:滚动时,我必须移动注释视图图像,并且有一段时间只有常规地图而不是旧时效果)。

我基本上想要完成的是在 maptiles 上方但在注释视图下方分层的子视图,并且在用户滚动时保持稳定 - 有什么想法吗?

4

3 回答 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];
    }
}

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

于 2010-01-15T12:18:25.070 回答
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;
}
于 2016-03-17T23:19:12.893 回答
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's设置autoresizesSubviewsNO.

于 2016-01-03T10:24:13.290 回答