MapKit zoom to user current location

后端 未结 8 511
慢半拍i
慢半拍i 2021-02-01 17:59

I am trying to simply show user\'s location on the map, but I need to when app launches, the map should zoom to current location ,but I don\'t know why map doesn\'t zoom at all

相关标签:
8条回答
  • 2021-02-01 18:22

    Code:

    import UIKit
    import MapKit
    
    class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
    
    @IBOutlet weak var mapview: MKMapView!
    
    let locationmanager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        mapview.mapType = MKMapType.standard
    
        let location = CLLocationCoordinate2DMake(22.4651, 70.0771)
    
        let span = MKCoordinateSpanMake(0.5, 0.5)
        let region =  MKCoordinateRegionMake(location, span)
        mapview.setRegion(region, animated: true)
    
        let annonation = MKPointAnnotation()
        annonation.coordinate = location
        annonation.title = "Chandi Bazar"
        annonation.subtitle = "Jamnagar"
        //
        mapview.addAnnotation(annonation)
    
        self.locationmanager.requestWhenInUseAuthorization()
    
        if CLLocationManager.locationServicesEnabled()
        {
            locationmanager.delegate = self
            locationmanager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationmanager.startUpdatingLocation()
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    
        locationmanager.stopUpdatingLocation()
    }
    
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
    {
        if (annotation is MKUserLocation)
        {
            return nil
        }
    
        let annotationidentifier = "Annotationidentifier"
    
        var annotationview:MKAnnotationView
        annotationview = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationidentifier)
    
        let btn = UIButton(type: .detailDisclosure)
    
        btn.addTarget(self, action: #selector(ViewController.hirenagravat(sender:)), for: .touchUpInside)
    
        annotationview.rightCalloutAccessoryView = btn
    
        annotationview.image = UIImage(named: "images (4).jpeg")
    
        annotationview.canShowCallout = true
    
        return annotationview
    }
    
    func hirenagravat(sender:UIButton)
    {
        let fvc = storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController
        self.navigationController?.pushViewController(fvc!, animated: true)
    }
    
    0 讨论(0)
  • 2021-02-01 18:22

    when you set region -> you cannot zoom the map anymore. below to fix that

    func yourFuncName() {
    //this is global var
    regionHasBeenCentered = false
    if !self.regionHasBeenCentered {
        let span: MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
        let userLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(_cllocationOfUserCurrentLocation!.coordinate.latitude, _cllocationOfUserCurrentLocation!.coordinate.longitude)
        let region: MKCoordinateRegion = MKCoordinateRegionMake(userLocation, span)
    
        self.mapView.setRegion(region, animated: true)
        self.regionHasBeenCentered = true
        }
    
        self.mapView.showsUserLocation = true
    }
    
    0 讨论(0)
  • 2021-02-01 18:27
    func animateToUserLocation() {
        if let annoation = mapView.annotations.filter ({ $0 is MKUserLocation }).first {
            let coordinate = annoation.coordinate
            let viewRegion = MKCoordinateRegion(center: coordinate, latitudinalMeters: 200, longitudinalMeters: 200)
            mapView.setRegion(viewRegion, animated: true)
        }
    }
    
    0 讨论(0)
  • 2021-02-01 18:31

    In swift 4.1. To change the Zoom level you need to change the span value i.e MKCoordinateSpan(latitudeDelta: 0.95, longitudeDelta: 0.95)

     let lat =  "33.847105"
        let long = "-118.2673272"
        let region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: Double(lat)!, longitude: Double(long)!), span: MKCoordinateSpan(latitudeDelta: 0.95, longitudeDelta: 0.95))
        DispatchQueue.main.async {
            self.mapView.setRegion(region, animated: true)
        }
    

    Swift 5.0

    let span = MKCoordinateSpan.init(latitudeDelta: 0.01, longitudeDelta:
    0.01)
    let coordinate = CLLocationCoordinate2D.init(latitude: 21.282778, longitude: -157.829444) // provide you lat and long 
    let region = MKCoordinateRegion.init(center: coordinate, span: span)
    mapView.setRegion(region, animated: true)
    

    0 讨论(0)
  • 2021-02-01 18:33

    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 = 200
    func 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 = true
    centerMapOnLocation(location: homeLocation)
    

    This will start the app with the location specified in the variable zoomed in.

    0 讨论(0)
  • 2021-02-01 18:35

    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

    0 讨论(0)
提交回复
热议问题