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?
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.
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:
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.
MyLocation est une démo iOS Swift iOS.
Vous pouvez utiliser cette démo pour:
Afficher la position actuelle.
Choisissez un autre emplacement: dans ce cas, arrêtez de suivre l'emplacement.
Ajoutez une punaise à un MKMapView (iOS) lorsque vous le touchez.
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)
}
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
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!
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