2012-09-13 81 views
0

我有針對不同位置的自定義引腳圖像,我可以同時顯示所有不同的引腳。但問題是,當我顯示用戶的當前位置時,所有引腳顏色都會改變。MKMapView:顯示用戶當前位置時的引腳顏色變化

這裏是代碼:

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

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

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

    MKAnnotationView *test=[[MKAnnotationView alloc] 
          initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"]; 

    test.canShowCallout = YES; 
    //  test.animatesDrop = YES; 


    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    test 
    .rightCalloutAccessoryView = rightButton; 

    switch (_pushpinTag) { 
     case 5: 
      test.image = [UIImage imageNamed:@"pushpin_green.png"]; 
      break; 

     case 6: 
      test.image = [UIImage imageNamed:@"pushpin_blue.png"]; 
      break; 

     case 7: 
      test.image = [UIImage imageNamed:@"pushpin_black.png"]; 
      break; 

     case 8: 
      test.image = [UIImage imageNamed:@"pushpin_yellow.png"]; 
      break; 

     case 3: 
      test.image = [UIImage imageNamed:@"pushpin_red.png"]; 
      break; 

     default: 
      break; 
    } 

    return test; 
} 
} 

現在在不同的按鈕按下,不同的引腳(自定義圖像)顯示。可以說我有綠色,藍色,黑色和黃色的針腳。我按下按鈕顯示綠色引腳,然後是藍色,然後是黑色,所有引腳都顯示在各自的圖像中。但是,當我按下按鈕顯示用戶當前位置時,所有引腳都會更改爲最後一個按下引腳,即黑色。

這裏是顯示用戶的當前位置的代碼:

- (IBAction)currentLocationButton:(id)sender { 

_mapView.showsUserLocation = YES; 
[_mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES]; 

} 

任何人都可以指出什麼是錯我在幹嘛?

謝謝大家:)

+0

什麼是'_pushpinTag'以及它是如何設置的? – Anna

回答

2

你註釋需要包含的東西,你可以用它來設置他們在viewForAnnotation顏色。 MKAnnotation協議定義了所有標註,標題,副標題和座標。如果標題和副標題不足以確定您想要的針的顏色,請編寫您自己的課程並添加名爲pinType的屬性。然後,根據用戶按下的按鈕創建註釋集pinType。當viewForAnnotation被調用時,通常使用dequeueReusableAnnotationViewWithIdentifier/initWithAnnotation來獲取視圖,將提供的註釋轉換爲類並使用其pinType設置圖像。這裏有一些未經測試的代碼,足以讓你知道

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MyAnnotation class]]) 
    { 
     MyAnnotation* myAnno = (MyAnnotation)annotation; 
     MKAnnotationView *test; 

     test = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationIdentifier"]; 
     if (view == nil) 
     { 
      test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"]; 
     } 
     switch(myAnno.pinType) 
     { 
      case kBLACK_TAG: test.image = [UIImage imageNamed:@"pushpin_black.png"]; 
          break; 
     } 
    } 
} 
1

你沒有將使用環保的觀點

MKAnnotationView *test; 

test = (MKAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationIdentifier"]; 
if (view == nil) 
{ 
test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"]; 
test.tag = _pushpinTag; // set tag of new pins to _pushpinTag 
} 

其次,你的一般錯誤是邏輯錯誤。每當iOS詢問您的註釋視圖時,您都會根據_pushpinTag的值設置圖像,這就是爲什麼您的所有針腳都會重繪爲最後一次選擇的顏色的原因。如果您還設置您的引腳上的標記值,這樣的事情:

static int kGREEN_TAG = 5; 
static int kBLUE_TAG = 6; 
static int kBLACK_TAG = 7; 
static int kYELLOW_TAG = 8; 

switch (test.tag) 
{ 
case kBLACK_TAG: 
      test.image = [UIImage imageNamed:@"pushpin_black.png"]; 
      break; 
. 
. 
. 
} 
+0

您注意到iOS可以隨時詢問註釋視圖,但是在獲取視圖時使用_pushpinTag而不是在創建註釋時重複了此問題。如果在iOS請求一個視圖時沒有更多的可重用註釋視圖,那麼即使當_pushpinTag具有不同的值時可能已經創建了註釋,它也會獲得_pushpinTag的價值。 – Craig

相關問題