Iphone 将子视图添加到';在地图上方但在注释视图下方?

Iphone 将子视图添加到';在地图上方但在注释视图下方?,iphone,overlay,mkmapview,subview,Iphone,Overlay,Mkmapview,Subview,对于我正在构建的一个应用程序,我有一个自定义的“旧地图”效果PNG,我想覆盖在MKMapView视图上。不幸的是,我尝试的两种方法都不完全正确: 在MKMapView中添加一个子视图(问题:PNG的UIImageView被放置在注释引脚上方,这看起来很奇怪 将图像本身设置为注释视图,并将其放置在其他图像的下方(问题:在滚动时,我必须移动注释视图图像,在一段时间内,只有常规贴图而不是旧时效果) 我基本上想要实现的是拥有一个子视图,该子视图分层在maptiles的上方,但在注释视图的下方,当用户滚动

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

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

  • 我基本上想要实现的是拥有一个子视图,该子视图分层在maptiles的上方,但在注释视图的下方,当用户滚动任何想法时,该子视图将保持稳定?

    请注意,所有
    MKMapView
    子视图层次结构、注释、行为等都在内部私有类中进行,因此可以更改任何内容(在某种程度上,我建议)此结构可能会导致您的应用程序被Appstore拒绝。

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

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

    这段代码很旧,但可能仍然与您中的一些人相关

    我想使地图更暗,但不是注释视图

    我所做的很简单,我还不知道它是否有一些退路

    我在
    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];
        }
    }
    
    -(void)mapView:(MKMapView*)mapView添加注释视图:(NSArray*)视图
    {
    用于(MKAnnotationView*视图中的视图){
    view.center=[self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
    [self.viewDark addSubview:view];
    }
    }
    
    希望对您有所帮助。当然,如果您发现此解决方案存在任何问题,请告诉我:)

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

    编辑#2:
    另一件对我有帮助的事情是将
    self.viewDark
    autoresizesSubviews
    设置为
    NO
    ,我做了一些类似的事情,最后以不同的方式完成了。我想通过添加白色覆盖来淡出地图视图,但我不想淡出注释。我在地图上添加了一个覆盖(事实上,我不得不添加两个,因为它不喜欢我尝试为整个地球添加覆盖)

    然后,您需要添加映射代理来绘制它们:

    - (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;
    }
    
    -(mkoverlayrender*)地图视图:(MKMapView*)地图视图渲染器foroverlay:(id)overlay{
    if([overlay iskindof类:MKPolygon.class]){
    MKPolygonRenderer*polygonView=[[MKPolygonRenderer alloc]initWithOverlay:overlay];
    polygonView.fillColor=[UIColor COLOR WITHRED:255.0/255.0绿色:255.0/255.0蓝色:255.0/255.0 alpha:0.4];
    返回polygonView;
    }
    返回零;
    }
    
    Wow,这是一个没有答案的老问题。+1我需要这个,有人知道了吗?答案不错,这对覆盖效果也很好,我们希望在地图上有一个渐变,但希望图钉突出。
    - (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;
    }