在委托方法中,您可以检查所选注释是否属于类型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
因为这是参数的真正含义。它是注解的视图对象——而不是注解模型对象本身。这将使委托方法中的代码不那么混乱。
所以更改(MKAnnotationView *)annotation
为(MKAnnotationView *)view
并且检查变为if ([view.annotation isKindOfClass:[MKUserLocation class]])
。
理想情况下,您应该在调用这些委托方法以及更改视图上的图像时将“选定”状态存储在注释模型对象中。然后,在 中viewForAnnotation
,代码应该检查注释的状态,并使用与委托方法相同的逻辑将图像设置在那里(不同的图像取决于它是否“被选中”)否则,可能发生的情况是在选择注释后,如果用户缩放/平移地图,图像可能会恢复为viewForAnnotation
.