web-dev-qa-db-fra.com

Afficher l’emplacement actuel et mettre à jour l’emplacement dans MKMapView dans Swift

J'apprends à utiliser la nouvelle langue Swift (seulement Swift, pas Objective-C). Pour ce faire, je souhaite créer une vue simple avec une carte (MKMapView Je veux trouver et mettre à jour l’emplacement de l’utilisateur (comme dans l’application Apple Map)).

J'ai essayé ça, mais rien ne s'est passé:

import MapKit
import CoreLocation

class MapView : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }
}

Pourrais-tu m'aider s'il te plaît?

42
PMIW

Vous devez remplacer CLLocationManager.didUpdateLocations (partie de CLLocationManagerDelegate) pour être averti lorsque le gestionnaire d’emplacement récupère l’emplacement actuel:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.last{
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        self.map.setRegion(region, animated: true)
    }
}

REMARQUE: Si votre cible est iOS 8 ou une version ultérieure, vous devez inclure la clé NSLocationAlwaysUsageDescription ou NSLocationWhenInUseUsageDescription dans votre Info.plist pour que les services de localisation fonctionnent.

61
zisoft

100% de travail, étapes faciles et testés

Importer des bibliothèques:

import MapKit
import CoreLocation

définir les délégués:

CLLocationManagerDelegate,MKMapViewDelegate

Prendre variable:

let locationManager = CLLocationManager()

écrivez ce code sur viewDidLoad ():

self.locationManager.requestAlwaysAuthorization()

    // For use in foreground
    self.locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
    }

    mapView.delegate = self
    mapView.mapType = .standard
    mapView.isZoomEnabled = true
    mapView.isScrollEnabled = true

    if let coor = mapView.userLocation.location?.coordinate{
        mapView.setCenter(coor, animated: true)
    }

Écrire une méthode de délégué pour l'emplacement:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate

    mapView.mapType = MKMapType.standard

    let span = MKCoordinateSpanMake(0.05, 0.05)
    let region = MKCoordinateRegion(center: locValue, span: span)
    mapView.setRegion(region, animated: true)

    let annotation = MKPointAnnotation()
    annotation.coordinate = locValue
    annotation.title = "Javed Multani"
    annotation.subtitle = "current location"
    mapView.addAnnotation(annotation)

    //centerMap(locValue)
}

Ne pas oublié de définir la permission dans info.plist

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

Il semble comme:

enter image description here

21
Mr.Javed Multani

Pour Swift 3 et XCode 8, je trouve cette réponse:

  • Tout d'abord, vous devez définir la confidentialité dans info.plist. Insérer une chaîne NSLocationWhenInUseUsageDescription avec votre description, pourquoi vous souhaitez obtenir l'emplacement de l'utilisateur. Par exemple, définissez la chaîne "For map in application".

  • Deuxièmement, utilisez cet exemple de code

    @IBOutlet weak var mapView: MKMapView!
    
    private var locationManager: CLLocationManager!
    private var currentLocation: CLLocation?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        mapView.delegate = self
    
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    
        // Check for Location Services
    
        if CLLocationManager.locationServicesEnabled() {
            locationManager.requestWhenInUseAuthorization()
            locationManager.startUpdatingLocation()
        }
    }
    
    // MARK - CLLocationManagerDelegate
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        defer { currentLocation = locations.last }
    
        if currentLocation == nil {
            // Zoom to user location
            if let userLocation = locations.last {
                let viewRegion = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 2000, 2000)
                mapView.setRegion(viewRegion, animated: false)
            }
        }
    }
    
  • Troisièmement, définissez l'indicateur d'emplacement d'utilisateur dans le storyboard pour mapView.

20
Evgeny Karev

MyLocation est une démo iOS Swift iOS.

Vous pouvez utiliser cette démo pour:

  1. Afficher la position actuelle.

  2. Choisissez un autre emplacement: dans ce cas, arrêtez de suivre l'emplacement.

  3. Ajoutez une punaise à un MKMapView (iOS) lorsque vous le touchez.

7
Ahmed Lotfy

Pour Swift 2, vous devez le modifier comme suit:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations.last

    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

    self.map.setRegion(region, animated: true)
}
3
Mark

vous devez remplacer CLLocationManager.didUpdateLocations

 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    let userLocation:CLLocation = locations[0] as CLLocation
    locationManager.stopUpdatingLocation()

    let location = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)

    let span = MKCoordinateSpanMake(0.5, 0.5)

    let region = MKCoordinateRegion (center:  location,span: span)

    mapView.setRegion(region, animated: true)
}

vous devez également ajouter NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription à votre paramètre Plist Result comme valeur

1
MiladiuM

Dans Swift 4, j'avais utilisé la fonction de délégué locationManager définie ci-dessus.

func locationManager(manager: CLLocationManager!, 
    didUpdateLocations locations: [AnyObject]!) {

.. mais cela devait être changé pour ..

func locationManager(_ manager: CLLocationManager,
    didUpdateLocations locations: [CLLocation]) {

Cela venait de .. https://github.com/lotfyahmed/MyLocation/blob/master/MyLocation/ViewController.Swift - merci!

1
Tybion

Salut Parfois, la définition de showsUserLocation dans le code ne fonctionne pas pour une raison étrange.

Alors essayez une combinaison des éléments suivants.

Dans viewDidLoad ()

  self.mapView.showsUserLocation = true

Allez dans votre storyboard dans Xcode, dans l'inspecteur d'attributs du panneau de droite, cochez la case Emplacement utilisateur , comme dans le image jointe . lancez votre application et vous devriez pouvoir voir l'emplacement de l'utilisateur

enter image description here

0
Vision Mkhabela