MKMapView和用户位置计时

时间:2015-10-01 09:57:33

标签: ios swift location mkmapview

我正在使用MKMapView,它放置在选项卡式应用程序控制器(AppTabController:UITabViewController)中的第三个VC(MapViewController:UIViewController)上。如果我正确理解了UITabViewController,那么在用户导航到MapViewController之前,它不会被实例化。

MKMapView通过插座链接到MapViewController

 @IBOutlet weak var mapView: MKMapView!

MapViewController通过MapViewController的扩展符合 MKMapViewDelegate 协议,我在MapViewController的viewDidLoad方法中设置了MKMapView委托。

extension MapViewController: MKMapViewDelegate {
    // delegate methods
}

override func viewDidLoad() {
    super.viewDidLoad()

    mapView.delegate = self
}

在MapViewController的viewDidLoad中,我调用 showMyLocation()将地图置于1 km的用户位置中心。 1公里。区域并显示其注释。

同样的方法与MapViewController导航栏上的“用户”按钮相关联,允许用户根据需要返回其位置。

@IBAction func showMyLocation() {
    let region = MKCoordinateRegionMakeWithDistance(mapView.userLocation.coordinate, 1000, 1000)
    mapView.setRegion(mapView.regionThatFits(region), animated: true)
}

我没有使用 CLLocationManager 来确定用户的位置。因为MKMapView能够将用户的位置返回给应用程序。

答案我到目前为止发现了一种CLLocationManager方法。

我对从MKMapView获取用户坐标时出现的时序依赖性有点不确定。

  1. 如果我启动应用并立即导航到MapViewController选项卡, mapView.userLocation.coordinate 返回的坐标为 0,0

    < / LI>
  2. 但是,如果我在启动应用程序并等待一分钟左右之后再转到MapViewController选项卡,则坐标是我所在位置的预期坐标。

  3. 最后,如果我启动应用程序并立即导航到MapViewController,坐标为0,0,如上所述,但如果我立即点击“用户”按钮,坐标会立即更新为预期的坐标而没有延迟。 / p>

  4. 到目前为止,我的解决方案是实现 didUpdateUserLocation 委托方法,告诉我MKMapView何时为用户获取了有效位置。

    func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) {
        if self.rideLocations.isEmpty {
            self.showUserLocation()
        }
    }
    

    我的问题是我是否实施了处理MKMapView用户位置行为时间的必要模式?

    我的目标是让用户的位置在MKMapView上正确显示,无论他们何时导航到包含地图的标签,而且避免过度使用设备位置服务。

    感谢迄今为止的所有答案 - 他们在我的Swift / IOS之旅中获得了巨大的帮助!

1 个答案:

答案 0 :(得分:1)

我知道这是一个旧线程,但是我想我会加2美分,以防它对其他人有帮助。要解决此问题,您可以实现mapView委托方法mapView(_:viewFor :),该方法在每次向地图添加注释时都会调用。这包括用户位置。只需在方法顶部添加代码即可。当MKUserLocation注释添加到mapView时,仅调用一次。在viewDidLoad中,禁用该按钮。

`func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?{
  if annotation is MKUserLocation {
        //return nil so map view draws "blue dot" for standard user location
        showMyLocation()
        enable your button here.
        return nil
   }
//other code here.`