2

我有以下代码:

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

但是,当我选择用户位置时,会出现图钉图标。如何将用户位置的选择注释设置为无效,但对所有其他注释启用?

4

2 回答 2

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因为这是参数的真正含义。它是注解的视图对象——而不是注解模型对象本身。这将使委托方法中的代码不那么混乱。

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

  2. 理想情况下,您应该在调用这些委托方法以及更改视图上的图像时将“选定”状态存储在注释模型对象中。然后,在 中viewForAnnotation,代码应该检查注释的状态,并使用与委托方法相同的逻辑将图像设置在那里(不同的图像取决于它是否“被选中”)否则,可能发生的情况是在选择注释后,如果用户缩放/平移地图,图像可能会恢复为viewForAnnotation.

于 2014-05-01T12:26:41.023 回答
0

如果我正确理解您的问题,您需要使用类型为 (NSMutableArray) 的 annotationArray,每次您放下 pin 时都会保存所有 pin。例如:像这样的东西:

MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc]init];
annotationPoint.coordinate = annotationCoord;
annotationPoint.title = yourPinName;//add more things...

[annotationArray addObject:annotationPoint];
[self addAnnotation:annotationPoint];//self is your mapView

这有帮助吗?

于 2014-05-01T03:06:46.450 回答