2013-05-01 63 views
2

我使用CLLocationManager的座標顯示用戶在地圖上的位置。每次我移動或縮放地圖時,用戶位置指針(帶有聲納效果的藍色指針)都會消失,然後重新回到地圖上。 (我不是指聲納動畫效果,藍色的小點字面消失,然後重新動畫)。iOS - 當地圖視圖發生變化(滾動,縮放)時,Mapkit保持動畫用戶位置

當地圖滾動/縮放時,我沒有調用任何其他方法。 使用斷點,僅將返回零被稱爲在地圖上的委託方法:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //User's Pin 
    if([annotation class] == MKUserLocation.class) { 
     return nil; 
    } 

....rest of my code here, nothing else is called as I am only plotting user at this time... 
} 

回答

0

抓下viewForAnnotation委託方法的默認用戶位置標註所以它不是繪製。您可以使用布爾值來打開或關閉它,也可以與LocationManager一起創建自己的自定義註釋。此鏈接應該讓你在正確的軌道上:

User Location Anno

+0

我認爲這個問題存在一些混淆。請參閱更新的原始帖子。我不想改變用戶的「藍點」。我只是想知道爲什麼它會一直消失,然後在每次地圖滾動/縮放時重新制作動畫。 – JimmyJammed 2013-05-01 23:14:39

3

在我原來的答覆,我認爲目標是要替換當您使用MKMapViewshowUserLocation = YESuserTrackingMode = MKUserTrackingModeFollow你得到閃爍的藍點。因此,我展示瞭如何用圖像或標準引腳替換它。

但事實證明,問題不在於存在顯示當前位置的藍點,而在於它的動畫正在被中斷,並且隨着用戶在地圖上平移和縮放而出現並消失。

如果您撥打removeAnnotations並刪除所有註釋(包括系統生成的MKUserLocation註釋),我已經看到該行爲。如果您關閉showUserLocation並重新開啓,我也看到了這種行爲。

該OP指出,這些情況都不適用,但對於未來的讀者,這些是可能導致此行爲的一些考慮事項。


原來的答覆:

最簡單的答案是,以確保您的控制器是delegateMKMapView,然後定義一個viewForAnnotation檢測一個MKUserLocation,並替換爲任何你想要的註解視圖。例如,如果你有你想顯示@"user.png"圖像,它可能看起來像:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     NSString *annotationIdentifier = @"userlocation"; 
     MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 
     if (annotationView) 
     { 
      annotationView.annotation = annotation; 
     } 
     else 
     { 
      annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier]; 
      annotationView.image = [UIImage imageNamed:@"user.png"]; 
     } 

     return annotationView; 
    } 

    // again, if you had other annotation types, such as MKPointAnnotation, 
    // handle them here 

    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     ... 
    } 

    return nil; 
} 

或者,如果你想顯示一個標準的引腳,你可以:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     if ([annotation isKindOfClass:[MKUserLocation class]]) 
     { 
      NSString *annotationIdentifier = @"userlocation"; 
      MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 
      if (annotationView) 
      { 
       annotationView.annotation = annotation; 
      } 
      else 
      { 
       annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier]; 
      } 

      return annotationView; 
     } 
    } 

    // again, if you had other annotation types, such as MKPointAnnotation, 
    // handle them here 

    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     ... 
    } 

    return nil; 
} 
+0

上面假設您已經使用了「MKMapView」的「顯示用戶位置」功能。 – Rob 2013-05-01 04:42:22

+0

是的,我的控制器是代表,其他所有引腳都顯示得很好,並且設置斷點表明事件在這個方法中被調用。 – JimmyJammed 2013-05-01 22:46:44

+0

這是我目前爲用戶位置所做的: if([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } – JimmyJammed 2013-05-01 22:47:05

0

如果你有使用標準mapciew.showsUserLocation = true;來繪製用戶的位置,並且它滑動到屏幕上而不是在原地跳動,那麼這可能是因爲您的方法viewForAnnotation。確保你只是動畫你添加的引腳,而不是mapview添加的用戶位置。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
    { 
     return nil; 
    } 
    //do stuff to the annotations that you added 
} 
+0

是的,這是我目前正在做的事情,但每次我移動/縮放地圖時,它都會「重新加載」用戶位置並重新對其進行動畫處理(以便藍點消失,然後重新開始動畫並開始跳動)。這給它一個「重新加載」的含義,我不想要。建議? – JimmyJammed 2013-05-01 22:46:02

+0

我不確定你的意思是「reanimating in」。當我打開和關閉蘋果地圖中的跟蹤時,點出現或消失,不會從任何位置滑入。您的代碼還有什麼功能?地圖上的任何觸發器完成平移或縮放?您的代碼中有多少個地方開啓和關閉跟蹤?你應該檢查他們是否被意外調用。 – Craig 2013-05-01 23:33:33

+0

好吧,於是發現了一個可能有助於解決它的新bug。我在地圖上添加了一些虛擬引腳。在初始加載時,它們全部顯示。如果我滾動/縮放地圖,它們都會消失,不會重新出現。我所指的「再動畫」就是藍點消失,然後聲納氣泡出現(大),然後藍點出現,聲納氣泡縮小並像正常一樣開始動畫。 – JimmyJammed 2013-05-01 23:45:07

相關問題