我有以下代码将MKCoordinateRegion设置为MKMapView:
override func viewDidLoad() {
super.viewDidLoad()
mapView.showsUserLocation = true
mapView.setUserTrackingMode(.followWithHeading, animated: true)
currentLocationCoordinateRegion = MKCoordinateRegion(center: mapView.userLocation.coordinate, latitudinalMeters: 25, longitudinalMeters: 25)
mapView.setRegion(currentLocationCoordinateRegion, animated: true)
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = kCLDistanceFilterNone
let status = CLLocationManager.authorizationStatus()
if status == .authorizedAlways || status == .authorizedWhenInUse, status == .restricted {
} else {
locationManager.requestAlwaysAuthorization()
}
}
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
if currentLocationCoordinateRegion == nil {
currentLocationCoordinateRegion = MKCoordinateRegion(center: mapView.userLocation.coordinate, latitudinalMeters: 25, longitudinalMeters: 25)
mapView.setRegion(currentLocationCoordinateRegion, animated: true)
}
}
但是,地图视图显示的区域远大于20米乘20米。
问题出在哪里,我该如何解决?
答案 0 :(得分:0)
我尝试在第一次运行该代码后第二次运行该代码。只是第一次没有完全放大。
答案 1 :(得分:0)
问题可能在这里:
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
if currentLocationCoordinateRegion == nil { // <--
currentLocationCoordinateRegion = MKCoordinateRegion(center: mapView.userLocation.coordinate, latitudinalMeters: 25, longitudinalMeters: 25)
mapView.setRegion(currentLocationCoordinateRegion, animated: true)
}
}
这是我的理论。在开始使用时,Core Location会尝试获取用户位置的修补程序。最初,用户所在位置只有一个模糊的概念,您会得到didUpdate
。但是,运气好的话,用户会在哪里得到更好的主意,并且您再次获得didUpdate
。然后再次。再说一次,直到我们有一个好的解决方案。但是,您将丢弃第二,第三,第四次更新-一旦获得第一次更新,便会停止。我建议,这就是为什么第二次更好的原因。核心位置有时间获得更好的修复。