2012-02-03 81 views
2

我想爲當前用戶位置標註添加正確的附件按鈕。我發現了一些關於這個話題的問題,但他們似乎並不適合我。這裏是我到目前爲止,我已經成功地把正確的附件按鈕到我的其他註釋代碼:如何在當前位置標註上放置正確的附件按鈕?

- (MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
     //TODO: this doesn't seem to be working? 
    if ([annotation isKindOfClass:[MKUserLocation class]]) { 
     MKAnnotationView * aV = [mapView viewForAnnotation:annotation]; 
     aV.canShowCallout = YES; 
     aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     return nil; 
    } 
    return nil; 
} 

我在幾個地方,解決辦法是讓一個自定義MKAnnotationView爲用戶位置讀但我還沒有看到如何對用戶位置進行演示 - 我已成功完成了我的地圖上的其他註釋。

示例代碼將是最佳方式。

回答

9

您應該再次獲得用戶位置註釋視圖的參考。 按照方法被調用的iOS> = 5

選項1

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    MKAnnotationView *aV; 
    for (aV in views) { 
      if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { 
       MKAnnotationView* annotationView = aV; 
       annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      } 
    } 
} 

見下以及委託方法

替代方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation]; 
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
} 

確保添加委託方法,這樣你就可以做任何事情了標註按鈕被點擊:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

在這兩種方法中的任何的iOS被調用,您可以將其添加左/右accessorybutton。確保您不要通過檢查用戶位置註釋視圖的子視圖計數來添加此按鈕兩次。

您還可以添加/刪除運行它accessoryviews,但我相信你不會想刪除it.buttons

+0

謝謝@chatur,這確實有用!順便說一句,你會如何支持iOS 4.x和iOS 5版本? – 2012-02-04 15:00:50

1

你的主要問題是你在這兩種情況下返回零。您還應該使用重用標識符。

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

if ([annotation isKindOfClass:[MKUserLocation class]]) { 
    MKAnnotationView * aV = [mapView dequeueReusableAnnotationViewWithIdentifier:@"locationView"]; 
    if (aV == nil) 
     aV = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationView"]; 
    aV.canShowCallout = YES; 
    aV.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    return aV; 
    } 
return nil; 
} 

您還需要實現:

- (void)mapView:(MKMapView *)_mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

的標註配件的行爲。

+0

看起來非常有前途,我給它一個嘗試,因此投票! – 2012-02-03 18:16:53

+0

這個工作適合你嗎?我在其中一個應用程序中擁有幾乎相同的代碼,並且我沒有任何問題。 – brendan 2012-02-03 22:33:13

+0

不怕!我現在在地圖上看不到用戶位置標記,有些不妥。如果我改回它返回零,然後它像以前一樣工作,但當然附件按鈕不顯示。建議? – 2012-02-04 04:57:18

相關問題