iphone mapview为前面带来了第一个和最后一个注释

时间:2010-09-14 21:56:41

标签: iphone mapping mkmapview mkannotation

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

[self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]];

我在我的代码中使用了[[mapView annotations]objectAtIndex: 0]并且有效,但是当我尝试将它带到前面时它会崩溃。我是否访问了错误的图层?

感谢您的帮助。

3 个答案:

答案 0 :(得分:12)

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

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

id<MKAnnotation> annotation = [[mapView annotations] objectAtIndex:0];
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation];
if (annotationView != nil) {
    [annotationView.superview bringSubviewToFront:annotationView];
}

但是,您应该注意以下几点:

    如果注释位于屏幕外的点上,或者注释尚未完成添加到地图中,则
  1. annotationView可能为nil。但是,如果它是nil,您可能并不关心是否在屏幕上的注释是否在前面。
  2. 您需要在bringSubviewToFront的超级视图上呼叫annotationView,而不是self.view甚至mapView,因为这两个都不是annotationView的超级视图1}}。

答案 1 :(得分:1)

这对我来说效果更好:

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

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // if it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    MKAnnotationView *returnedAnnotationView = nil;
    returnedAnnotationView = [CUSTOMVIEW createViewAnnotationForMapView:self.mapView annotation:annotation];
    // SOME CUSTOM PROCESSING...
    returnedAnnotationView.layer.zPosition = 3;
    return returnedAnnotationView;
}

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

答案 2 :(得分:0)

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;
    }
}