2013-06-19 91 views
0

我正在向MKMapView添加一些註釋,並且這些註釋具有UIImageView,與AFNetworking異步加載,作爲左側標註附件視圖。下面是執行:地圖註釋沒有正確顯示配件視圖

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

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

     MKAnnotationView *annotationView = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 
     if (annotationView == nil) { 
      annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
      annotationView.enabled = YES; 
      annotationView.canShowCallout = YES; 
      annotationView.image = [UIImage imageNamed:@"map_pin"]; 

      UIImageView *userAvatar = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
      [userAvatar setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=small",[[(MapAnnotation *)annotation user] facebookID]]] placeholderImage:[UIImage imageNamed:@"user_placeholder"]]; 
      userAvatar.layer.cornerRadius = 4.0; 
      userAvatar.layer.masksToBounds = YES; 
      userAvatar.layer.borderColor = [[UIColor blackColor] CGColor]; 
      userAvatar.layer.borderWidth = 1; 

      annotationView.leftCalloutAccessoryView = userAvatar; 

      UIButton *rightCallout = [UIButton buttonWithType:UIButtonTypeInfoLight]; 

      annotationView.rightCalloutAccessoryView = rightCallout; 

     } 

     annotationView.annotation = annotation; 

     return annotationView; 
    } 

    return nil; 
} 

這裏的問題是:有時候(不是所有的)的時候針對不同用戶的註釋被加載到地圖上,他們表現出他們所有的相同的圖像。

比方說,我必須加載兩個註解與這樣的信息:

註釋1個 姓名(名稱):約書亞 日期時間(字幕):19/06,11:00 圖片:www.myurl.com /joshua.jpg

註解2 名稱(標題):馬修 日期時間(字幕):10/06,20:00 圖片:www.myurl.com/mathew.jpg

有時它們被示出標題和副標題正確但加載的圖像對所有人都是一樣的(約書亞的圖像,反之亦然)。

我在這裏缺少的東西是這種方法?

回答

1

致電dequeueReusableAnnotationViewWithIdentifier:將在第一個回電nil將滿足annotationView == nil並設置您的註釋視圖。因此,所有以下對dequeueReusableAnnotationViewWithIdentifier:的調用都將返回第一個創建的帶有指定頭像圖像的註釋視圖。因此[userAvatar setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=small",[[(MapAnnotation *)annotation user] facebookID]]] placeholderImage:[UIImage imageNamed:@"user_placeholder"]];只被調用一次。

您需要將註釋特定更改移至「if nil」設置範圍之外的註釋視圖。

因此,您應該在每次mapview詢問annotationView時設置userAvatar圖像。 因此,像這樣:

MKAnnotationView *annotationView = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 
     if (annotationView == nil) { 
      annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
      annotationView.enabled = YES; 
      annotationView.canShowCallout = YES; 
      annotationView.image = [UIImage imageNamed:@"map_pin"]; 

      UIImageView *userAvatar = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
      userAvatar.layer.cornerRadius = 4.0; 
      userAvatar.layer.masksToBounds = YES; 
      userAvatar.layer.borderColor = [[UIColor blackColor] CGColor]; 
      userAvatar.layer.borderWidth = 1; 

      annotationView.leftCalloutAccessoryView = userAvatar; 

      UIButton *rightCallout = [UIButton buttonWithType:UIButtonTypeInfoLight]; 

      annotationView.rightCalloutAccessoryView = rightCallout; 
     } 
[((UIImageView *)annotationView.leftCalloutAccessoryView) setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=small",[[(MapAnnotation *)annotation user] facebookID]]] placeholderImage:[UIImage imageNamed:@"user_placeholder"]]; 

這將每個地圖視圖詢問註釋視圖的時間分配正確的圖像。

Cheers Morten

+0

這就是問題!它現在解決了!謝謝@mbogh! – CainaSouza

+0

@CainaSouza我已經更新了一些更詳細的答案。但很高興幫助:) – mbogh

+0

我感謝您的關注!很好的解釋! – CainaSouza