缩放后MKMapview注释动态图像变化

时间:2013-05-10 22:48:37

标签: ios mapkit mkannotationview

我正在开发一个小项目,在地图上显示7种不同类型的注释。我的注释取自数组中的url结果,我使用JSON解析它。我有很多注释,一旦地图加载,一切看起来都很好。放大和缩小后,引脚图像由于某种原因改变为错误的引脚图像(特定图像,没有线索原因)。

我相信我在这里遗漏了一些东西......请你帮忙:)?

以下是我的代码的一部分,如果您需要它,请告诉我:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{

static NSString *identifier;

if(_mapView.tag==1){identifier = @"TurbulencePin";}
if(_mapView.tag==2){identifier = @"IcingPin";}
if(_mapView.tag==3){identifier = @"WindsPin";}
if(_mapView.tag==4){identifier = @"TemperaturePin";}
if(_mapView.tag==5){identifier = @"CloudsPin";}
if(_mapView.tag==6){identifier = @"VisibilityPin";}
if(_mapView.tag==7){identifier = @"MultiplePin";}


if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

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

    CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    annotationView = nil;

    if (annotationView == nil) {

        annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;


        UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",identifier]];
        annotationView.image = img;

    }
else
    {

        annotationView.annotation = annotation;

    }


    return annotationView;

}
return nil;

}

更新

根据其他人的反馈,我修改了图像设置的代码如下:

 Annotation *myCustomAnn = (Annotation *)annotation;
 NSString *imgName = myCustomAnn.imageName;
 UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"%@Pin.png",imgName]];
 annotationView.image = img;

 return annotationView;

另外,我删除了annotationView = nil;

但是,我无法将annotation.m中的图像名称设置为硬编码值,因为我需要为每个注释显示不同的图像。我确信有一个解释,但我可以从mapView:viewForAnnotation下的annotation.m获得的唯一值是注释坐标(myCustomAnn.coordinate.latitudemyCustomAnn.coordinate.longitude),我不知道如何从annotation.m获取其他属性

其他属性,例如title,imgname等返回为null

3 个答案:

答案 0 :(得分:5)

主要问题是viewForAnnotation中的代码依赖于外部变量_mapView.tag来确定注释视图。

假设地图调用viewForAnnotation委托方法的时间和频率是不安全的。

如果注释的视图取决于某些值,通常最好将这些值直接嵌入注释对象本身。这样,在viewForAnnotation委托方法中,您可以通过传递给方法的annotation参数引用这些特定于注释的值。应在创建注释时(在调用addAnnotation之前)设置这些特定于注释的值。

有关更多详细信息和示例,请参阅:

另一个问题是,在调用annotationView后,代码正在设置nildequeueReusableAnnotationViewWithIdentifier,这会导致出局失败。


至少在viewForAnnotation中,处理Annotation类的更正代码可能看起来像这样(不是整个方法 - 只是第二个if内的部分):

static NSString *identifier = @"ann";

CustomAnnotationView* annotationView = (CustomAnnotationView*)[mapView 
    dequeueReusableAnnotationViewWithIdentifier:identifier];

//annotationView = nil;  // <-- remove this line

if (annotationView == nil) 
{
    annotationView = [[CustomAnnotationView alloc] 
                         initWithAnnotation:annotation 
                         reuseIdentifier:identifier];
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
}
else
{
    annotationView.annotation = annotation;
}

//MOVE the setting of the image to AFTER the dequeue/create 
//because the image property of the annotation view 
//is based on the annotation and we can update image in one place
//after both the dequeue and create are done...

//Get the image name from the annotation ITSELF 
//from a custom property (that you add/set)
Annotation *myCustomAnn = (Annotation *)annotation;

NSString *imgName = myCustomAnn.imageName;  
//imageName is the custom property you added/set

UIImage *img = [UIImage imageNamed:
                   [NSString stringWithFormat:@"%@.png",imgName]];

annotationView.image = img;

return annotationView;

答案 1 :(得分:0)

由Rob解决

问题是,我无法检索我在VC中设置的注释属性。原因是我在设置所有注释的属性之前使用了[_mapView addAnnotation:ann];命令。也就是说,通过将此行移动到注释初始属性设置的末尾部分,解决了问题。

谢谢大家,非常感谢Rob! 我接下来的挑战了。

答案 2 :(得分:0)

一个问题是viewForAnnotation正在根据类实例变量确定要显示的正确图像。通常,注释图像的标识符将是自定义注释本身的属性,而不是某些外部实例变量。

最重要的是,在设置所有注释的属性之前,似乎正在将注释添加到地图中。应该推迟addAnnotation,直到设置了所有注释的属性。

或者,您可以将注释添加到NSMutableArray,根据需要调整它们,并且仅使用addAnnotations(注意s)在最后添加注释,并将其传递给阵列。