iphone mapview将第一个和最后一个注释放在前面

iphone mapview将第一个和最后一个注释放在前面,iphone,mapping,mkmapview,mkannotation,Iphone,Mapping,Mkmapview,Mkannotation,我需要一些可以在mk*函数之外使用的代码。我需要运行自定义函数,将数组中的第一个和最后一个标记放在前面。(在我屏幕上所有其他标记的顶部)。我试过了 [self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]]; 我在代码中使用了[[mapView annotations]objectAtIndex:0],这是可行的,但当我试图将其放在前面时,它崩溃了。我访问了错误的层还是什么 谢谢你的帮助。你把错误的东西带到了前

我需要一些可以在mk*函数之外使用的代码。我需要运行自定义函数,将数组中的第一个和最后一个标记放在前面。(在我屏幕上所有其他标记的顶部)。我试过了

[self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]];
我在代码中使用了
[[mapView annotations]objectAtIndex:0]
,这是可行的,但当我试图将其放在前面时,它崩溃了。我访问了错误的层还是什么


谢谢你的帮助。

你把错误的东西带到了前台。也就是说,
annotations
数组是符合
MKAnnotation
协议的对象数组(因此类型为
id
),它们不是视图

相反,您应该获取所需注释的视图,并将它们放在前面:

id<MKAnnotation> annotation = [[mapView annotations] objectAtIndex:0];
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation];
if (annotationView != nil) {
    [annotationView.superview bringSubviewToFront:annotationView];
}
id注释=[[mapView注释]对象索引:0];
MKAnnotationView*annotationView=[mapView视图for注释:注释];
如果(注释视图!=nil){
[annotationView.superview将子视图带到前面:annotationView];
}
但是,您应该注意以下几点:

  • annotationView
    如果注释位于屏幕外的点上,或者注释尚未完成添加到地图中,则可能为
    nil
    。然而,如果它是
    nil
    ,您可能不在乎屏幕上没有的注释是否在前面
  • 您需要在
    annotationView
    的superview上调用
    bringSubviewToFront
    ,而不是在
    self.view
    甚至
    mapView
    上,因为它们都不是
    annotationView
    的superview

  • 这对我来说效果更好:

    在以下位置设置注释视图图层的zPosition(annotationView.layer.zPosition):

    -(MKAnnotationView*)映射视图:(MKMapView*)注释的映射视图:(id)注释
    {
    //如果是用户位置,只需返回nil。
    if([annotation isKindOfClass:[MKUserLocation类]])
    返回零;
    MKAnnotationView*returnedAnnotationView=nil;
    returnedAnnotationView=[CUSTOMVIEW createViewAnnotationForMapView:self.mapView注释:注释];
    //一些自定义处理。。。
    returnedAnnotationView.layer.zPosition=3;
    returnedAnnotationView;
    }
    

    注意,我假设默认的zPosition为0。设置为3使所有3个标记都显示在顶部。

    这很有意义-谢谢!我不必担心注释为零,因为前面的“缩放到区域”代码确保了当我调用此代码时,它们将出现在屏幕上(至少对于一小部分,在绘制时)。我明天会把代码试一试。非常感谢您的回复。重要的呼叫会在annotationView.superview上显示SubViewToFront而不是annotationView如果(![l isKindOfClass:[MKUserLocation class]]),您可能还需要添加此选项{
    For IOS 11.0 onwards use below solution to bring the Custom Callout above all annotations.
    
    Add z position observer where you are initialising the Custom callout 
    
    [self.layer addObserver:self forKeyPath:@"zPosition" options:0 context:nil];
    
    
    -(void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(NSDictionary *)change
                           context:(void *)context
    {
        if(object == self.layer)
        {
            self.layer.zPosition = FLT_MAX;
        }
    }
    
    For IOS 11.0 onwards use below solution to bring the Custom Callout above all annotations.
    
    Add z position observer where you are initialising the Custom callout 
    
    [self.layer addObserver:self forKeyPath:@"zPosition" options:0 context:nil];
    
    
    -(void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(NSDictionary *)change
                           context:(void *)context
    {
        if(object == self.layer)
        {
            self.layer.zPosition = FLT_MAX;
        }
    }