当设备定位服务关闭时,用户会打开我的应用程序,该应用程序正在使用iOS Mapbox和Mapbox Navigation SDK。用户无法在地图上看到其设备位置,因为定位服务已关闭。当用户转到设备设置并打开定位服务,然后返回应用程序时,用户位置仍然不可见。当我通过mapView.userLocation.coordinate检查用户位置坐标时,我得到了一个无效的坐标。此外,即使我调用locationManager.startUpdatingLocation(),也不会调用以下委托方法:
func mapView(_ mapView: MGLMapView, didUpdate userLocation: MGLUserLocation?)
我可以通过删除旧的地图视图并设置新的地图视图来解决这个问题。这意味着,当用户在进入"设置"并打开定位服务后返回应用程序时,我必须删除旧的地图视图,并设置另一个视图来显示用户位置。但我不想那样做。
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse || status == .authorizedAlways {
isLocationServicesEnabled = true
if mapView != nil {
mapView.removeFromSuperview()
mapView = nil
}
resetupMapView()
}
}
打开定位服务后,如何在地图视图上显示用户位置?有没有办法重新加载地图视图?
当我试图在下面的代码中显示地图上的用户位置时,我收到了以下消息:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse || status == .authorizedAlways {
if mapView != nil {
mapView.showsUserLocation = true
}
}
}
由于未捕获异常"MGLUserLocationAnnotationTypeException"而终止应用,原因:"用户位置注释视图必须是MGLUserLocation AnnotationView的一种。"。我不知道为什么。我还实现了viewForAnnotation委托方法来显示用于注释的自定义图像。
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
let reuseIdentifier = "reusableView"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
if annotationView == nil {
annotationView = MGLAnnotationView(reuseIdentifier: reuseIdentifier)
let markerImageView = UIImageView(image: UIImage(named: "Orange"))
markerImageView.frame = CGRect(x: 0, y: 0, width: viewModel.markerImageWidth, height: viewModel.markerImageHeight)
annotationView?.frame = markerImageView.frame
annotationView?.center = markerImageView.center
annotationView?.addSubview(markerImageView)
}
return annotationView
}
mapView有一个名为showsUserLocation
的Bool属性。即使在打开定位服务后,如果该属性设置为false
,则不会显示用户的位置。
将mapView.showsUserLocation = true
添加到didChangeAuthorization
方法中。
******编辑******
当映射添加每个注释(甚至是userAnnotation)时,会调用viewFor annotation
。但是userAnnotation需要是MGLUserLocationAnnotationView。如果您正在为注释使用自定义图像,但不想向userAnnotation添加一个,则需要在viewFor annotation
方法中排除它。最简单的方法是:
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
// We're not concerned with the user annotation.
guard annotation is YOUR-ANNOTATION-TYPE else { return nil }
let reuseIdentifier = "reusableView"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)
if annotationView == nil {
annotationView = MGLAnnotationView(reuseIdentifier: reuseIdentifier)
let markerImageView = UIImageView(image: UIImage(named: "Orange"))
markerImageView.frame = CGRect(x: 0, y: 0, width: viewModel.markerImageWidth, height: viewModel.markerImageHeight)
annotationView?.frame = markerImageView.frame
annotationView?.center = markerImageView.center
annotationView?.addSubview(markerImageView)
}
return annotationView
}
如果你确实想为你的userAnnotation分配一个自定义图像,那么请参阅Mapbox网站上的这个例子,解释如何分配。自定义用户注释