MapKit zoom to user current location MapKit zoom to user current location xcode xcode

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()    }}