2017-09-19 18 views
1

Je travaille sur un projet sur MapKit en utilisant Swift 3. Ce que le code ci-dessous fait est une fois que je charge l'application que la carte chargera par défaut . Ensuite, lorsque l'utilisateur appuie sur le bouton, il vous emmène à l'emplacement de l'utilisateur. La façon dont je veux résoudre ce problème est que je veux charger l'emplacement de l'utilisateur dès que l'application fonctionne, puis quand l'utilisateur décide de se déplacer sur l'écran, il/elle pourrait appuyer sur le bouton, puis recentrer le emplacement de l'utilisateur à nouveau. Comme ça fonctionne sur Maps.Obtenir l'emplacement de l'utilisateur lorsque l'application fonctionne et se recentrer après avoir bougé avec un bouton

when app loads capture image

when button is hit

import UIKit 
import MapKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 
    // connecting the map from the mainBoard and refering to it as "myMap"..... 
    @IBOutlet weak var myMap: MKMapView! 

    @IBAction func refLocation(_ sender: Any) { 
     manager.startUpdatingLocation() 
    } 

    let manager = CLLocationManager() 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     if let location = locations.last { 
      let span: MKCoordinateSpan = MKCoordinateSpanMake(0.0075,0.0075) 
      let myLocation :CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 
      let region: MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 
      myMap.setRegion(region, animated: true) 
     } 

     self.myMap.showsUserLocation = true 

     manager.stopUpdatingLocation() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     manager.delegate = self 
     manager.desiredAccuracy = kCLLocationAccuracyBest 
     manager.requestWhenInUseAuthorization() 
    } 
} 

Répondre

0

On ne sait pas ce que vous demandez.

Si vous souhaitez obtenir une mise à jour d'emplacement unique, vous pouvez utiliser la fonction func requestLocation().

Vous pouvez créer un gestionnaire de position (et vous définir comme délégué) dans viewDidLoad de votre contrôleur de vue et appeler requestLocation() une fois.

Puis appelez à nouveau requestLocation() dans votre action de bouton.

Faites que votre méthode didUpdateLocations recentre toujours la carte. De cette façon, vous recevrez une et une seule mise à jour en cliquant sur votre bouton, et la carte sera recentrée dès la réception de la mise à jour.

+0

i besoin de l'application pour charger la carte avec l'emplacement de l'utilisateur lorsque les pistes de l'application. Cependant, je veux donner à l'utilisateur la possibilité de se déplacer sur la carte quand il en a besoin. et une fois que l'utilisateur veut recentrer la carte, l'utilisateur utilisera le bouton pour recentrer l'emplacement de l'utilisateur. J'espère que ceci est clair. – asbhn

+0

Voulez-vous afficher votre contrôleur de carte au lancement? Si oui, les étapes que je décris feront exactement ce que vous voulez. (L'application lance le contrôleur de vue qui contient votre carte.La méthode 'viewDidLoad()' du contrôleur de vue lance le gestionnaire de position et demande un emplacement.Lorsque l'emplacement est livré, le contrôleur de vue de carte centre la carte sur cet emplacement. De même, l'action du bouton demande un emplacement et recentre la carte sur cet emplacement lorsque la mise à jour arrive.) –

0

Essayez ce code pour Swift 3

import UIKit 
import MapKit 
import CoreLocation 


class ViewController2: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 

var locationManager = CLLocationManager() 
var currentLocation = CLLocation() 
var currentLat: Double! 
var currentLon: Double! 
@IBOutlet weak var mapView: MKMapView! 



override func viewDidLoad() { 
    super.viewDidLoad() 

    myLocation() 
} 


func myLocation() 
{ 
    if currentLocation.coordinate.latitude == 0.00 || currentLocation.coordinate.longitude == 0.0 
    { 
     print("no location") 
    } 
    else 
    { 
     self.locationManager.requestWhenInUseAuthorization() 
     if CLLocationManager.locationServicesEnabled() 
     { 
      locationManager.delegate = self 
      locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     } 

     let locManager = CLLocationManager() 
     locManager.requestWhenInUseAuthorization() 

     if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || 
      CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways) 
     { 
      currentLocation = locManager.location! 
     } 

     print("currentLongitude: \(currentLocation.coordinate.longitude)") 
     print("currentLatitude: \(currentLocation.coordinate.latitude)") 

     currentLon = currentLocation.coordinate.longitude 
     currentLat = currentLocation.coordinate.latitude 

     let span = MKCoordinateSpanMake(0.2, 0.2) 
     let region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: currentLat, longitude: currentLon), span: span) 
     mapView.setRegion(region, animated: true) 
    } 

} 

@IBAction func MyLocationBtnPressed(_ sender: Any) 
{ 
    let span = MKCoordinateSpanMake(0.1, 0.1) 
    let region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: currentLat, longitude: currentLon), span: span) 
    mapView.setRegion(region, animated: true) 
} 
} 
0

Vous ne devez pas appeler startUpdatingLocation() à nouveau parce que MapView sait toujours userLocation.

Remplacer

@IBAction func refLocation(_ sender: Any) { 
    manager.startUpdatingLocation() 
} 

avec

@IBAction func refLocation(_ sender: Any) { 
    let region: MKCoordinateRegion = MKCoordinateRegionMake(myMap.userLocation.coordinate, myMap.region.span) 
    mapView.setRegion(region, animated: true) 
}