2012-12-13 60 views
1

我有地圖,而我添加多個註釋,像這樣:的MKMapView關閉屏幕標註圖像不正確

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; 
} 

這一切工作正常原始加載地圖。但是,當我選擇註釋(具有過長的發佈但包含放大的自定義代碼)時,先前繪製的註釋圖像已更改圖標。地圖不會重新繪製,註釋在該過程中不會重新添加。當我在地圖上縮回來時,圖像是不同的(它們具有不正確的關係params和錯誤的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; 

到:

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

大答案ANNA甚至很長一段時間後,幫助我 – raghul