添加子视图的MKMapView这是地图上方,但低于标注的看法?(Adding subview to

2019-09-01 03:51发布

对于应用我建,我有一个自定义的“老地图”效果PNG,我想覆盖上的MKMapView视图。 不幸的是,这样我试图做到这一点是完全正确的:

  1. 一个子视图添加到的MKMapView(问题:对于PNG的的UIImageView被放在上面的注释销,它看起来怪异
  2. 使图像注释视图本身,并将其置于其他的人(问题:上滚动,我要移动注释视图图像,并有一段时间只是常规的地图,而不是带点儿怀旧效果)。

我基本上要做到的是具有上面的maptiles但低于注释视图分层子视图,这将保持稳定,而用户滚动周围,有什么想法?

Answer 1:

请注意,所有MKMapView子视图层次结构,注释,行为等,在内部私有收益MKMapViewInternal类,所以任何更改(在某种程度上,我建议或其他)在这个结构可能会导致您的应用程序从苹果商店被拒绝。

我没有一个完整的解决方案,只是一个想法。 我的想法是要覆盖查看有没有相同的上海华注解视图,并确保注释将被放置在我们覆盖。 在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];
    }
}

此代码你想要什么半 - 你配置的地图瓦片和注释之间的视图。 剩下的任务是根据地图滚动/缩放(如果我找到了办法,我会发布)更改自定义重叠视图帧。



Answer 2:

我做了类似的,并在年底以不同的方式事情。 我想通过添加白色覆盖褪色的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;
}


Answer 3:

这是很老,但也许仍然是你们中的一些相关。

我想使地图更暗,而不是注解视图。

我所做的是很简单的,我还不知道,如果它有一些回退...

我把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.viewDarkautoresizesSubviewsNO



文章来源: Adding subview to MKMapView that's above the map but below the annotation views?