我需要一些可以在mk *函数之外使用的代码。我需要运行我的自定义函数,将FIRST和LAST标记放在一个数组中。 (所以在我屏幕上的所有其他标记之上)。我试过了
[self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]];
我在我的代码中使用了[[mapView annotations]objectAtIndex: 0]
并且有效,但是当我尝试将它带到前面时它会崩溃。我是否访问了错误的图层?
感谢您的帮助。
答案 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];
}
但是,您应该注意以下几点:
annotationView
可能为nil
。但是,如果它是nil
,您可能并不关心是否在屏幕上的注释是否在前面。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;
}
}