Comment zoomer un MKMapView sur l’emplacement actuel des utilisateurs sans CLLocationManager?

Avec MKMapView il y a une option appelée “Afficher l’emplacement actuel des utilisateurs” qui affichera automatiquement l’emplacement d’un utilisateur sur la map .

Je voudrais déplacer et zoomer à cet endroit quand il est trouvé (et si cela change).

Le problème est, il ne semble pas y avoir de méthode appelée lorsque l’emplacement de l’utilisateur est mis à jour sur la map , donc je n’ai nulle part où mettre le code qui zoom/scroll .

Y a-t-il un moyen d’être averti lorsqu’un MKMapView a (ou a mis à jour) l’emplacement de l’utilisateur pour pouvoir le déplacer / zoomer? Si j’utilise mon propre CLLocationManager les mises à jour que je reçois ne correspondent pas aux mises à jour du marqueur de l’utilisateur sur la carte.

Cela ressemble à une fonctionnalité de base, mais j’ai passé des semaines à chercher une solution et je n’ai rien trouvé de proche.

    Vous devez vous inscrire pour les notifications KVO de la propriété MKMapView de MKMapView .

    Pour ce faire, placez ce code dans viewDidLoad: de votre ViewController ou n’importe où à l’endroit où votre vue de carte est initialisée.

     [self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:NULL]; 

    Ensuite, implémentez cette méthode pour recevoir les notifications KVO

     - (void)observeValueForKeyPath:(NSSsortingng *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([self.mapView showsUserLocation]) { [self moveOrZoomOrAnythingElse]; // and of course you can use here old and new location values } } 

    Ce code fonctionne bien pour moi.
    BTW, self est mon ViewController dans ce contexte.

    Ceci est une combinaison de la réponse de ddnv et Dustin qui a fonctionné pour moi:

    mapView est le nom de la map MKMapView *;

    Dans viewDidLoad, ajoutez cette ligne, notez qu’il pourrait y avoir plus de lignes dans la charge. Ceci est simplement simplifié.

     - (void) viewDidLoad { [self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil]; } 

    Ensuite, créez la méthode de listage réelle qui déplace la carte vers l’emplacement actuel:

     // Listen to change in the userLocation -(void)observeValueForKeyPath:(NSSsortingng *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { MKCoordinateRegion region; region.center = self.mapView.userLocation.coordinate; MKCoordinateSpan span; span.latitudeDelta = 1; // Change these values to change the zoom span.longitudeDelta = 1; region.span = span; [self.mapView setRegion:region animated:YES]; } 

    N’oubliez pas de traiter correctement et désinscrivez l’observateur:

     - (void)dealloc { [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; [self.mapView removeFromSuperview]; // release crashes app self.mapView = nil; [super dealloc]; } 

    Depuis iOS 5.0 Apple a ajouté une nouvelle méthode à MKMapView. Cette méthode fait exactement ce que vous voulez et plus encore.

    Jetez un oeil à: https://developer.apple.com/documentation/mapkit/mkmapview

     - (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated; 

    Vous pouvez surveiller le moment où MKMapView met à jour l’emplacement de l’utilisateur sur la carte en implémentant le protocole MKMapViewDelegate . Juste mettre en œuvre:

     - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy; if (accuracy ......) { } } 

    Ce rappel doit être parfaitement synchronisé avec ce qui est affiché sur la carte.

    Essaye ça:

     [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

    Pas de problème … Dans la méthode viewDidLoad de votre sous-classe UIViewController qui a MKMapView, ajoutez ceci (en supposant que votre MKMapView soit nommée map):

     CLLocation *location = [[[CLLocation alloc] initWithLatitude:map.centerCoordinate.latitude longitude:map.centerCoordinate.longitude] autorelease]; //Get your location and create a CLLocation MKCoordinateRegion region; //create a region. No this is not a pointer region.center = location.coordinate; // set the region center to your current location MKCoordinateSpan span; // create a range of your view span.latitudeDelta = BASE_RADIUS / 3; // span dimensions. I have BASE_RADIUS defined as 0.0144927536 which is equivalent to 1 mile span.longitudeDelta = BASE_RADIUS / 3; // span dimensions region.span = span; // Set the region's span to the new span. [map setRegion:region animated:YES]; // to set the map to the newly created region