我有以下代码:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotation{
annotation.image = [UIImage imageNamed:@"pinIconOn.png"];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotation{
annotation.image = [UIImage imageNamed:@"pinIconOff.png"];
}
但是,当我选择用户位置时,会出现图钉图标。如何将select注释设置为用户位置的void,但是为所有其他注释启用?
答案 0 :(得分:1)
在委托方法中,您可以检查所选注释是否为MKUserLocation
类型,如果是,则不要更改图像。
MKUserLocation
是用户位置注释的文档类。
在这些委托方法中,第二个参数是MKAnnotationView
该类具有属性annotation
,该属性指向视图所针对的基础注释模型对象。检查annotation
属性的类型。
例如:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed:@"pinIconOn.png"];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed:@"pinIconOff.png"];
}
另外两项建议:
不要在这些委托方法中为参数annotation
命名。使用与view
文档中建议的名称相同的名称,因为这正是参数的真实含义。它是注释的 view 对象 - 而不是注释模型对象本身。这将使委托方法中的代码更容易混淆。
所以将(MKAnnotationView *)annotation
更改为(MKAnnotationView *)view
,检查变为if ([view.annotation isKindOfClass:[MKUserLocation class]])
。
理想情况下,您应该存储"所选"调用这些委托方法以及更改视图上的图像时,注释模型对象中的状态。然后,在viewForAnnotation
中,代码应检查注释的状态,并使用与委托方法相同的逻辑设置图像(根据是否""选择&#的不同图像34;否则)否则,可能发生的情况是,在选择注释后,如果用户缩放/平移地图,图像可能会恢复为viewForAnnotation
中指定的值。
答案 1 :(得分:0)
如果我理解你的问题,你需要使用一个类型为(NSMutableArray)的annotationArray,它会在你每次丢弃一个引脚时保存所有的引脚。例如: 像这样的东西:
MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc]init];
annotationPoint.coordinate = annotationCoord;
annotationPoint.title = yourPinName;//add more things...
[annotationArray addObject:annotationPoint];
[self addAnnotation:annotationPoint];//self is your mapView
这对此有帮助吗?