У меня есть карта, установленная в центр и вращающаяся в соответствии с местоположением и направлением пользователя, но вид карты заблокирован, так как я не могу взаимодействовать с ней.
extension MapScreen: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
let region = MKCoordinateRegion.init(center: location.coordinate, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
mapView.setRegion(region, animated: true)
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
checkLocationAuthorization()
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
mapView.camera.heading = newHeading.magneticHeading
mapView.setCamera(mapView.camera, animated: true)
}
}
}
}
Как я могу позволить пользователю исследовать свое окружение; прокручивать, масштабировать, взаимодействовать с булавками и т. д., центрируясь и поворачиваясь к пользователю?
Используя метод делегата didUpdateLocations
, вы постоянно обновляете представление карты, отменяя любые изменения, сделанные пользователем.
Решение состоит в том, чтобы не использовать методы CLLocationManager
делегата для обновления представления карты.
Просто установите userTrackingMode
на карте на .followWithHeading
, и вид карты сделает всю работу за вас. Как только пользователь взаимодействует с картой, режим отслеживания изменится на .none
.
Вы можете добавить кнопку для повторной активации режима отслеживания пользователей .followWithHeading
.
Это то, что я в итоге собрал, и это работает отлично.
func centerViewOnUserLocation() { mapView.setUserTrackingMode(.followWithHeading, animated:true)}
Спасибо! Это имеет смысл. Я попробую это завтра. Я, вероятно, буду использовать таймер вместо кнопки для повторной активации.