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