-1

我有以下代码将 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 米。

有什么问题,我该如何解决?

4

2 回答 2

0

我尝试在第一次运行后运行该代码,第二次运行。它只是第一次没有完全缩放。

于 2019-05-06T18:29:05.563 回答
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 。然后再次。再一次,直到我们有一个好的修复。但是您正在丢弃第二、第三、第四次更新——一旦获得第一次更新,您就会停止。我建议,这就是为什么第二次效果更好的原因;Core Location 有时间进行更好的修复。

于 2019-05-08T19:20:47.443 回答