【问题标题】:Removing selection image on user location annotation删除用户位置注释上的选择图像
【发布时间】:2014-05-01 01:56:38
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

    标签: ios uiimage mkannotation mkannotationview mkuserlocation


    【解决方案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 对象——而不是注解 model 对象本身。这将使委托方法中的代码不那么混乱。

      因此,将(MKAnnotationView *)annotation 更改为(MKAnnotationView *)view,支票变为if ([view.annotation isKindOfClass:[MKUserLocation class]])

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

    【讨论】:

      【解决方案2】:

      如果我正确理解了您的问题,您需要使用类型为 (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
      

      这有帮助吗?

      【讨论】:

      • 谢谢,但不完全是我想要的。我基本上希望引脚在我选择它时改变颜色。通过更改选择和取消选择时的图像,我已经使用发布的代码完成了此操作。但是,现在当我选择用户位置(蓝色闪烁点)时,会出现“pinIconOn.png”图像。我想防止这种情况发生。
      • 那么您需要验证您的注释是否不属于 mkUserLocation 类才能执行“某事”。请注意, userlocation 的类型是 (MKUserLocation ),它是这样找到的: MKUserLocation *userLocation = mapView.userLocation;....
      猜你喜欢
      • 2015-01-13
      • 2018-05-13
      • 2012-06-07
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多