我有以下代码:
- (void)mapViewMKMapView *)mapView didSelectAnnotationViewMKAnnotationView *)annotation{
annotation.image = [UIImage imageNamed"pinIconOn.png"];
}
- (void)mapViewMKMapView *)mapView didDeselectAnnotationViewMKAnnotationView *)annotation{
annotation.image = [UIImage imageNamed"pinIconOff.png"];
}
但是,当我选择用户位置时,会出现图钉图标。如何将用户位置的选择注释设置为无效,但为所有其他注释启用?
Best Answer-推荐答案 strong>
在委托(delegate)方法中,您可以检查所选注解是否为 MKUserLocation 类型,如果是,则不要更改图像。
MKUserLocation 是用户位置注释的文档类。
在这些委托(delegate)方法中,第二个参数是 MKAnnotationView 。
该类具有属性annotation ,它指向 View 所针对的底层注释模型对象。检查 annotation 属性的类型。
例如:
- (void)mapViewMKMapView *)mapView didSelectAnnotationViewMKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed"pinIconOn.png"];
}
- (void)mapViewMKMapView *)mapView didDeselectAnnotationViewMKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed"pinIconOff.png"];
}
另外两个建议:
不要在这些委托(delegate)方法中将参数命名为annotation 。使用与文档中建议的名称相同的名称,即 view ,因为这是参数的真正含义。它是注解的 view 对象——而不是注解 model 对象本身。这将使委托(delegate)方法中的代码不那么困惑。
所以将 (MKAnnotationView *)annotation 更改为 (MKAnnotationView *)view 并且检查变为 if ([view.annotation isKindOfClass:[MKUserLocation class]] ) .
理想情况下,您应该在调用这些委托(delegate)方法以及更改 View 上的图像时将“选定”状态存储在注释模型对象中。然后,在 viewForAnnotation 中,代码应该检查注解的状态,并使用与委托(delegate)方法相同的逻辑在其中设置图像(不同的图像取决于它是否“被选中”)否则,可能会发生什么是选择注释后,如果用户缩放/平移 map ,图像可能会恢复到 viewForAnnotation 中指定的值。
关于ios - 删除用户位置注释上的选择图像,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23400976/
|