删除用户位置注释上的选择图像

时间:2014-05-01 01:56:38

标签: ios uiimage mkannotation mkannotationview mkuserlocation

我有以下代码:

- (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,但是为所有其他注释启用?

2 个答案:

答案 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"];
}

另外两项建议:

  1. 不要在这些委托方法中为参数annotation命名。使用与view文档中建议的名称相同的名称,因为这正是参数的真实含义。它是注释的 view 对象 - 而不是注释模型对象本身。这将使委托方法中的代码更容易混淆。

    所以将(MKAnnotationView *)annotation更改为(MKAnnotationView *)view,检查变为if ([view.annotation isKindOfClass:[MKUserLocation class]])

  2. 理想情况下,您应该存储"所选"调用这些委托方法以及更改视图上的图像时,注释模型对象中的状态。然后,在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

这对此有帮助吗?