OStack程序员社区-中国程序员成长平台

标题: ios - 删除用户位置注释上的选择图像 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:09
标题: ios - 删除用户位置注释上的选择图像

我有以下代码:

- (void)mapViewMKMapView *)mapView didSelectAnnotationViewMKAnnotationView *)annotation{
    annotation.image = [UIImage imageNamed"pinIconOn.png"];
}

- (void)mapViewMKMapView *)mapView didDeselectAnnotationViewMKAnnotationView *)annotation{
    annotation.image = [UIImage imageNamed"pinIconOff.png"];
}

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



Best Answer-推荐答案


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

另外两个建议:

  1. 不要在这些委托(delegate)方法中将参数命名为annotation。使用与文档中建议的名称相同的名称,即 view,因为这是参数的真正含义。它是注解的 view 对象——而不是注解 model 对象本身。这将使委托(delegate)方法中的代码不那么困惑。

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

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

关于ios - 删除用户位置注释上的选择图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23400976/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4