2017-03-21 21 views
0

我要永遠對用戶位置爲中心的地圖,但我希望它永遠是在一個確切的縮放級別。我從這個answer得到的是,我不能沒有它縮放用戶位置使用userTrackingMode的iOS - 地圖用戶位置不居中

所以我創建了一個解決方法,按照用戶的位置

func updateRegion(withUserLocation userLocation: CLLocationCoordinate2D) { 
     var region = MKCoordinateRegion.init(center: userLocation, span: MapBodyViewConstants.zoomLevel) 
     // Avoid random spanning on the map by setting the region's span to be the same with the map's span 
     region.span = mapView.region.span 

     mapView.setRegion(region, animated: true) 
    } 

的問題是,我從CLLocationManager功能didUpdateLocations獲得位置和locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])manager.location?.coordinatelocations.last?.coordinate不同。這是一個小小的差異,但仍然存在差異(我應該提到,我只能通過無線網絡獲得這種差異)。

爲什麼有差異,我應該使用哪一個?經過一番研究,我得到了locations.last.coordinate是首選,但我不知道(也認爲藍色的用戶點使用經理的位置,但不知道這一個)

還有一個問題:什麼iOS使用獲取地圖用戶藍點位置?它是位置管理器的座標還是什麼?

我希望這些問題是很清楚......

編輯:另外,我想我應該不在話下。問題不在MKMapViewDelegate方法mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)。這工作正常。但在某些時候,當我啓動應用程序,我使用的位置,距離CLLocationManager,這就是問題的所在

回答

1

你看到的是正常的,由於每個如何更新的差異。您應該始終檢查您的位置對象的時間戳,以確定它是最新的。此外,這是來自Apple Docs的manager.location

在iOS 4.0及更高版本中,此屬性在啓動時可能包含更新的位置對象。特別是,如果顯著位置更新正在運行和您的應用程序被終止,此屬性與當您的應用程序重新啓動最近的位置數據更新(與您建立一個新的位置管理對象)。此位置數據可能比您的應用處理的上次位置事件更新。 檢查存儲在此屬性中的位置的時間戳總是一個好主意。如果接收器當前正在收集位置數據,但最小距離過濾器很大,則返回的位置可能相對較舊。如果是,您可以停止接收器並再次啓動以強制更新。