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

Zep*_*dio 17 iphone overlay subview mkmapview

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

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

我基本上想要实现的是一个子视图,它位于maptiles上方,但位于注释视图下方,并且在用户滚动时会保持稳定 - 任何想法?

Vla*_*mir 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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