2011-02-24 57 views
3

我已經閱讀了無數帖子在這裏堆棧和蘋果的文檔,並找不到任何東西來解決這個問題。放置一個藍點(用戶位置)只使用CLLocationManager

問題是如果您設置mapView.showsUserLocation = YES,那麼MapKit將開始將自己的GPS查詢發送到您的手機。

從蘋果文檔:

此屬性設置爲YES導致 使用核心位置 框架查找當前 位置的地圖視圖。只要此屬性爲 YES,地圖視圖就會繼續跟蹤 用戶的位置並定期更新它 。

如果你還想使用CLLocationManager,那麼當你打電話給[mylocationmanager startUpdatingLocation],那麼你正在手機上進行第二次GPS查詢。

現在你有2個獨立的進程要求GPS位置。

在模擬器上不是問題,但如果您在真實手機上試用它,則需要非常長的時間來獲取GPS位置。它也不一致10秒 - 1分鐘,而如果關閉mapView.showsUserLocation,則需要持續2-3秒。

一般來說,使用兩者似乎是一個非常糟糕的做法。

爲了靈活性和控制,我寧願使用CLLocationManager,但是如果你沒有設置mapView.showsUserLocation = YES,那麼你不會得到藍點!

我想平時覆蓋批註的方法:例如:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    if ([annotation isKindOfClass:MKUserLocation.class]) { 
     //it's the built-in user location annotation, return nil to get default blue dot... 
     return nil; 
    } 

    //handle your custom annotations... 
} 

但它不工作,很可能是因爲從來就沒有呼叫實際上把用戶標註在地圖上。

那麼有沒有人有解決方案只使用CLLocationManager將用戶的位置放置在地圖上?

回答

0

只需重寫viewForAnnotation方法是不夠的,你首先要你的註釋添加到地圖中通過調用

[mapView addAnnotation:annotationObject]; 

你annotationObject可以是實現MKAnnotation協議的任何類的一個實例。您可以在「註釋應用程序」部分的「MapKit指南」中找到詳細信息。

+0

是的,把我自己的批註會的工作,但它不會有相同的外觀作爲內置的用戶位置圖標(即無脈動動畫,內置分辨率縮放等)。也許有人有默認的PNG圖標,我可以使用它? – Totomobile 2011-02-24 21:42:14

+0

那麼您可以自定義用於註釋的圖像,以便您可以將藍點返回。分辨率縮放也自動內置在所有註釋中。脈動可能更困難。如果你有iOS開發者賬號,你也可以在蘋果開發論壇發佈你的問題,那裏也有真正的蘋果工程師,他們也可以幫助你。最後但並非最不重要的,我會考慮提交bug報告/功能請求,因爲這可能不是最佳/預期的行爲。 – Robin 2011-02-24 22:07:05

+0

使用自定義註釋的問題是您沒有得到跟蹤或準確性環。我現在只需在CLLocationManager完成它的任務後打開用戶位置,然後在需要使用CLLocationManager時將其關閉,即可解決問題。感謝您的建議,也許我們可以在真正的解決方案出來時更新此主題:) – Totomobile 2011-02-25 00:36:07

0

如果你需要證明你的左右位置(精度)只是藍點,你可以做這樣的:

MKCircle *accuracyCircle; 

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
// when you want update your position and accuracy 
[self.mapView removeOverlay:accuracyCircle]; 
accuracyCircle = [MKCircle circleWithCenterCoordinate:newLocation.coordinate 
                radius:newLocation.horizontalAccuracy]; 
[self.mapView addOverlay:accuracyCircle]; 
} 

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
if([overlay isKindOfClass:[MKCircle class]]) 
    { 
     MKCircleRenderer * circleRenderer = [[MKCircleRenderer alloc] initWithOverlay:overlay]; 
     circleRenderer.fillColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.2]; 
     return circleRenderer; 
    } 
    return nil; 
}