MKMapView屏幕外注释图像不正确

Eri*_*ric 1 iphone mkmapview mkannotationview ios6

我有一个地图,我添加了几个注释,如下所示:

    for (Users *user in mapUsers){

        double userlat = [user.llat doubleValue];
        double userLong = [user.llong doubleValue];

        CLLocationCoordinate2D userCoord = {.latitude =  userlat, .longitude =  userLong};

        MapAnnotationViewController *addAnnotation = [[MapAnnotationViewController alloc] initWithCoordinate:userCoord];

        NSString *userName = user.username;
        NSString *relationship = user.relationship;

        [addAnnotation setTitle:userName];
        [addAnnotation setRelationshipParam:relationship];

        [self.mainMapView addAnnotation:addAnnotation];
    }
Run Code Online (Sandbox Code Playgroud)

使用此委托方法代码:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    static NSString *identifier = @"AnnotationIdentifier";

if ([annotation isKindOfClass:[MapAnnotationViewController class]]) {

    MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (!annView) {
        annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                          reuseIdentifier:identifier];
    }
    MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;

    if ([sac.relationshipParam isEqualToString:@"paramA"])
    {
        annView.image = [UIImage imageNamed:@"image1.png"];
    }
    else if ([sac.relationshipParam isEqualToString:@"paramB"])
    {
        annView.image = [UIImage imageNamed:@"image2.png"];
    }
    else if ([sac.relationshipParam isEqualToString:@"paramC"])
    {
        annView.image = [UIImage imageNamed:@"image3.png"];
    }


    return annView;
}
else {
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

这一切都适用于地图的原始加载.但是,当我选择注释(其自定义代码太长而无法发布但包括放大)时,先前绘制的注释图像已更改图标.不会重绘地图,并且不会在该过程中重新添加注释.当我在地图上捏回来时,图像是不同的(他们将错误的关系参数与错误的image1-3.png匹配.

任何人都可以想到为什么会发生这种情况,或者寻找什么?

小智 6

所述dequeueReusableAnnotationViewWithIdentifier可以返回用于从当前不同的注释的注释视图annotation参数.

如果dequeueReusableAnnotationViewWithIdentifier成功(即您正在使用以前使用的注释视图),则必须更新其annotation属性以确保视图与当前annotation的属性匹配.

所以尝试更改此部分:

MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annView) {
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                      reuseIdentifier:identifier];
}
MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;
Run Code Online (Sandbox Code Playgroud)

至:

MKAnnotationView *annView = (MKAnnotationView *)[self.mainMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (!annView) {
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation
                                                      reuseIdentifier:identifier];
}
else {
    annView.annotation = annotation; // <-- add this
}

MapAnnotationViewController *sac = (MapAnnotationViewController *)annView.annotation;
Run Code Online (Sandbox Code Playgroud)


另一个潜在问题(不会引起问题中的问题)是视图的image属性仅relationshipParam在三个值之一时才设置.

如果某种方式relationshipParam不是这三个编码值中的一个并且视图已经出列,则图像将基于其他一些注释relationshipParam.

因此,您应该将else部件添加到设置image并将其设置为某个默认图像的部分,以防万一:

...
else if ([sac.relationshipParam isEqualToString:@"paramC"])
{
    annView.image = [UIImage imageNamed:@"image3.png"];
}
else
{
    annView.image = [UIImage imageNamed:@"UnknownRelationship.png"];
}
Run Code Online (Sandbox Code Playgroud)