我正在使用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获取用户坐标时出现的时序依赖性有点不确定。
如果我启动应用并立即导航到MapViewController选项卡, mapView.userLocation.coordinate 返回的坐标为 0,0
< / LI>但是,如果我在启动应用程序并等待一分钟左右之后再转到MapViewController选项卡,则坐标是我所在位置的预期坐标。
最后,如果我启动应用程序并立即导航到MapViewController,坐标为0,0,如上所述,但如果我立即点击“用户”按钮,坐标会立即更新为预期的坐标而没有延迟。 / p>
到目前为止,我的解决方案是实现 didUpdateUserLocation 委托方法,告诉我MKMapView何时为用户获取了有效位置。
func mapView(mapView: MKMapView, didUpdateUserLocation userLocation: MKUserLocation) {
if self.rideLocations.isEmpty {
self.showUserLocation()
}
}
我的问题是我是否实施了处理MKMapView用户位置行为时间的必要模式?
我的目标是让用户的位置在MKMapView上正确显示,无论他们何时导航到包含地图的标签,而且避免过度使用设备位置服务。
感谢迄今为止的所有答案 - 他们在我的Swift / IOS之旅中获得了巨大的帮助!
答案 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.`