J'essaie d'agrandir une carte sur l'emplacement actuel de l'utilisateur une fois la vue chargée, mais le message d'erreur "** * qui se termine en raison d'une exception non interceptée" NSInvalidArgumentException "a été ajouté, raison:" Région non valide "" quand la vue se charge. S'il vous plaît quelqu'un peut-il aider?
À votre santé!
- (void)viewDidLoad
{
[super viewDidLoad];
MKCoordinateRegion mapRegion;
mapRegion.center.latitude = map.userLocation.coordinate.latitude;
mapRegion.center.longitude = map.userLocation.coordinate.longitude;
mapRegion.span.latitudeDelta = 0.2;
mapRegion.span.longitudeDelta = 0.2;
[map setRegion:mapRegion animated: YES];
}
avez-vous défini showsUserLocation = YES
? MKMapView
ne mettra pas à jour l'emplacement s'il est défini sur NO
. Alors assurez-vous de cela.
Il est très probable que l'objet MKMapView
ne possède pas encore l'emplacement de l'utilisateur. Pour bien faire, vous devriez adopter le protocole MKMapViewDelegate
et implémenter mapView:didUpdateUserLocation:
map.delegate = self;
...
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKCoordinateRegion mapRegion;
mapRegion.center = mapView.userLocation.coordinate;
mapRegion.span.latitudeDelta = 0.2;
mapRegion.span.longitudeDelta = 0.2;
[mapView setRegion:mapRegion animated: YES];
}
Comme pour la réponse de Deepak, sauf que vous pouvez définir la durée de manière plus élégante:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
MKCoordinateRegion mapRegion;
mapRegion.center = map.userLocation.coordinate;
mapRegion.span = MKCoordinateSpanMake(0.2, 0.2);
[map setRegion:mapRegion animated: YES];
}
Vous ne voulez pas mettre à jour ce contenu dans userDidUpdateLocation s'il est possible que l'utilisateur veuille faire défiler la carte. Si vous mettez ce code dans la méthode mentionnée, l'utilisateur ne pourra pas faire défiler la carte, car la fonction sera appelée et recentrera la carte sur l'emplacement actuel.
Le moyen le plus simple est d'utiliser mapView.showAnnotations dans didUpdateUserLocation:
func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
mapView.showAnnotations([userLocation], animated: true)
}
C'est tout!
MKUserLocation est conforme au protocole MKAnnotation. Transmettez le userLocation en tant que tableau, la méthode showAnnotations permet à mapView d’agrandir une région et d’enrichir le tableau de MKAnnotations, dans ce cas il s’agit simplement de userLocation. Travaille pour moi.
Si vous souhaitez uniquement effectuer un zoom avant, utilisez une propriété initialUserLocation pour vérifier si la propriété initiale était déjà définie. Je n'aime pas utiliser dispatch_once du tout pour ce genre de chose
Voici la réponse de @ Deepak dans Swift 3 pour iOS 10:
extension ViewController: MKMapViewDelegate
{
func mapView( _ mapView: MKMapView, didUpdate userLocation: MKUserLocation )
{
let regionRadius = 400 // in meters
let coordinateRegion = MKCoordinateRegionMakeWithDistance( userLocation.coordinate, regionRadius, regionRadius )
self.mapView.setRegion( coordinateRegion, animated: true)
}
}
Le problème qui se produit lorsque vous utilisez la méthode didUpdateUserLocation
, vous ne pourrez pas faire défiler ni zoomer vers un autre emplacement. Il continuera de pointer vers votre position. Le meilleur moyen (que j'ai essayé) est d'utiliser le gestionnaire d'emplacement.
Dans la viewDidLoad
, ajoutez ce qui suit:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLLocationAccuracyKilometer;;
// showing user location with the blue dot
[self.mapView setShowsUserLocation:YES];
self.mapView.delegate = self;
// getting user coordinates
CLLocation *location = [_locationManager location];
CLLocationCoordinate2D coordinate = [location coordinate];
// showing them in the mapView
_mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 250, 250);
[self.locationManager startUpdatingLocation];
de cette façon, vous pouvez afficher votre position avec le zoom que vous souhaitez .. J'espère que cela vous aidera.
......
MKCoordinateRegion region =mapView.region;
region.center.latitude = currentLocation.latitude ;
region.center.longitude = currentLocation.longitude;
region.span.longitudeDelta /= 1000.0;
region.span.latitudeDelta /= 1000.0;
[mapView setRegion:region animated:YES];
[mapView regionThatFits:region];
Découvrez la méthode setUserTrackingMode de MKMapView. Le moyen le plus simple de suivre la position de l’utilisateur sur un MKMapView est probablement
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
De cette façon, vous n'avez pas non plus besoin d'être un MKMapViewDelegate. Les modes possibles sont:
MKUserTrackingModeNone = 0, // the user's location is not followed
MKUserTrackingModeFollow, // the map follows the user's location
MKUserTrackingModeFollowWithHeading, // the map follows the user's location and heading
Vérifiez la valeur de map.userLocation.coordinate
, le reste est OK.
Swift 3 version Utilisez cette méthode pour zoomer sur n'importe quelle coordonnée.
extension MKMapView{
func zoomIn(coordinate: CLLocationCoordinate2D, withLevel level:CLLocationDistance = 10000){
let camera =
MKMapCamera(lookingAtCenter: coordinate, fromEyeCoordinate: coordinate, eyeAltitude: level)
self.setCamera(camera, animated: true)
}
}