MapKit zoom to user current location
I faced similar issue and wasted 4 days thinking whats going wrong. Finally resolved with creating these lines of code in viewDidLoad
Method :
//Zoom to user location let noLocation = CLLocationCoordinate2D() let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 200, 200) mapView.setRegion(viewRegion, animated: false) mapView.showsUserLocation = true
In ViewDidLoad
Method add these new changes code :
override func viewDidLoad() { super.viewDidLoad() let locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest // Check for Location Services if (CLLocationManager.locationServicesEnabled()) { locationManager.requestAlwaysAuthorization() locationManager.requestWhenInUseAuthorization() } //Zoom to user location if let userLocation = locationManager.location?.coordinate { let viewRegion = MKCoordinateRegionMakeWithDistance(userLocation, 200, 200) mapView.setRegion(viewRegion, animated: false) } self.locationManager = locationManager DispatchQueue.main.async { self.locationManager.startUpdatingLocation() }}
Hope this helps to resolve your issue. Feel free to post comment if any further issue. Thanks
Here's another approach for Swift 3, XCode 8.2. First, write out a helper function:
let homeLocation = CLLocation(latitude: 37.6213, longitude: -122.3790)let regionRadius: CLLocationDistance = 200func centerMapOnLocation(location: CLLocation){ let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 2.0, regionRadius * 2.0) mapView.setRegion(coordinateRegion, animated: true)}
Then, call in in viewDidLoad()
mapView.showsUserLocation = truecenterMapOnLocation(location: homeLocation)
This will start the app with the location specified in the variable zoomed in.
In Swift 4.2 there has been changes with this code. Here is how it works now:
import UIKitimport MapKitimport CoreLocationclass MapVC: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate { @IBOutlet weak var mapView: MKMapView! var locationManager = CLLocationManager() let authorizationStatus = CLLocationManager.authorizationStatus() let regionRadius: Double = 1000 override func viewDidLoad() { super.viewDidLoad() mapView.delegate = self locationManager.delegate = self configureLocationServices() } func centerMapOnUserLocation() { guard let coordinate = locationManager.location?.coordinate else {return} let coordinateRegion = MKCoordinateRegion(center: coordinate, latitudinalMeters: regionRadius, longitudinalMeters: regionRadius) mapView.setRegion(coordinateRegion, animated: true) } func configureLocationServices() { if authorizationStatus == .notDetermined { locationManager.requestAlwaysAuthorization() } else { return } } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { centerMapOnUserLocation() }}