我有一张地图,我在其中添加了几个注释,如下所示:
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];
}
使用此委托方法代码:
-(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;
}
这一切都可以正常加载地图。但是,当我选择注释(其自定义代码太长而无法发布但包括放大)时,先前绘制的注释图像已更改图标。不会重绘地图,并且不会在该过程中重新添加注释。当我在地图上捏回来时,图像是不同的(他们将错误的关系参数与错误的image1-3.png匹配。
有人能想到为什么会这样,或者要找什么?
答案 0 :(得分: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;
为:
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;
另一个潜在的问题(不会引起问题中的问题)是仅当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"];
}