Принял меня некоторое время, но я думаю, что у меня это работает.
В вашем viewDidLoad():
// MARK: Location Settings
// Location Manager
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
mapView.delegate = self
mapView.settings.myLocationButton = true
}
Вам нужен этот кусок кода, чтобы назначить делегатов и начать обновление местоположения. Это также добавит кнопку местоположения на карту google. Вам также нужно будет добавить сообщение авторизации в info.plist.
{key=NSLocationWhenInUseUsageDescription}: {type=String}: {value=custom message}
.
И тогда вам нужно будет расширить эти делегатов (поместить их в нижней части MapViewController вне своего класса):
// MARK: - Extension: LocationManager
extension MapViewController: CLLocationManagerDelegate {
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == .AuthorizedWhenInUse {
locationManager.startUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.first {
mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 15, bearing: 0, viewingAngle: 0)
locationManager.stopUpdatingLocation()
}
}
}
// MARK: - Extension: GMSMapView
extension MapViewController: GMSMapViewDelegate {
func didTapMyLocationButtonForMapView(mapView: GMSMapView) -> Bool {
locationManager.updateLocation()
return false
}
}
CLocationManagerDelegate:
- didChangeAuthorizationStatus только вызывается при включении/отключении locationServices.
- isUpdateLocations вызывается, когда активируется startUpdating. Таким образом, он начнется, когда представление загрузится (как в viewDidLoad), а затем перестанет обновлять местоположение после его местоположения.
GMSMapViewDelegate:
- didTapMyLocationButton вызывается всякий раз, когда кнопка нажата место.