2010-03-14 3 views
10

J'utilise MapKit pour afficher la position de l'utilisateur par rapport aux broches qui les entourent. J'aimerais pouvoir imiter les fonctionnalités fournies par Maps via le bouton réticule dans le coin inférieur gauche de l'écran. Je suis déjà conscient que MapKit fournit un objet CLLocation avec l'emplacement de l'utilisateur via MKUserLocation, je voulais juste demander des conseils sur la façon dont je devrais rester concentré sur cet emplacement. Mon objectif initial était d'utiliser un NSTimer pour centrer la carte sur cette coordonnée toutes les 500 ms environ.Comment suivre l'emplacement de l'utilisateur avec MapKit

Y a-t-il une meilleure façon de procéder? Y a-t-il quelque chose de intégré à MapKit qui me manque pour accomplir cela?

Merci beaucoup, Brendan

Répondre

7

je pense que je fait utiliser le CoreLocation CLLocationManager et utiliser sa méthode déléguée locationManager:didUpdateToLocation:fromLocation:. De cette façon, vous n'avez pas la surcharge d'un NSTimer, et il ne se met à jour que lorsqu'un nouvel emplacement est disponible.

Vous pouvez extraire la longitude et la latitude de l'objet CLLocation envoyé à la méthode locationManager:didUpdateToLocation:fromLocation: et le transmettre à l'affichage de la carte.

+0

Cela ne serait-il pas plus inefficace à la fin, puisque MapKit utilise déjà le GPS de toute façon? Je pense que le GPS utiliserait plus de puissance qu'une minuterie. Cela étant dit, il y a de très bonnes chances que je me trompe. Je n'ai programmé que sur l'iphone pendant 1 semaine. – bloudermilk

+0

Vous dites donc que le Core Location ** n'utilise pas ** le GPS? –

+0

Je dis que CL * utilise * le GPS. Donc, si deux classes envoyaient une commande ping au récepteur GPS (CLLocationManager interne de MapKit pour la broche de localisation de l'utilisateur bleu et votre CLLocationManager proposé), il pourrait utiliser plus de puissance que l'unique MapKit CLLocationManager interne et un simple NSTimer. Je suppose que cela revient à savoir si le SDK de l'iPhone est assez intelligent pour soutenir plusieurs CLLocationManagers sans attacher chacun d'eux directement au GPS. Ou peut-être que le délégué MapKit fournit son propre didUpdateToLocation :? – bloudermilk

0

Je vais avec la réponse de Jacob Relkin. Le tutoriel This fournit une procédure pas à pas d'utilisation de CoreLocation dans une application iPhone. J'espère que cela vous aide.

Tout le meilleur.

+0

@Warrior, merci :) –

12

Il est très simple de faire en sorte que la carte mette à jour l'emplacement de l'utilisateur automatiquement, tout comme les cartes google. Il suffit de mettre showsUserLocation YES

self.mapView.showsUserLocation = YES 

... et puis mettre en œuvre le MKMapViewDelegate de re-centrer la carte lorsque l'emplacement est mis à jour.

-(void)    mapView:(MKMapView *)mapView 
     didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    if(isTracking) 
    { 
     pendingRegionChange = YES; 
     [self.mapView setCenterCoordinate: userLocation.location.coordinate 
           animated: YES]; 
    } 
} 

Et pour permettre à l'utilisateur de zoomer & pan sans avoir volé la vue à l'emplacement actuel ...

-(void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(isTracking && ! pendingRegionChange) 
    { 
     isTracking = NO; 
     [trackingButton setImage: [UIImage imageNamed: @"Location.png"] 
         forState: UIControlStateNormal]; 
    } 

    pendingRegionChange = NO; 
} 

-(IBAction) trackingPressed 
{ 
    pendingRegionChange = YES; 
    isTracking = YES; 
    [mapView setCenterCoordinate: mapView.userLocation.coordinate 
         animated: YES]; 

    [trackingButton setImage: [UIImage imageNamed: @"Location-Tracking.png"] 
        forState: UIControlStateNormal]; 
} 
+0

Est-il préférable d'utiliser le centre de MKMApView avec l'emplacement de l'utilisateur suivant que CoreLocation? J'ai eu une classe LocationUpdater qui renvoie une nouvelle CLLocation lors de la mise à jour. MKMapView est-il mis à jour avec la même fréquence? – quantumpotato

39

Si vous êtes sur IOS5 + ce qui est très facile. Il suffit de changer le « userTrackingMode » en utilisant un code tel que:

[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

Cela facilement suivre les utilisateurs emplacement actuel. Si vous faites glisser la carte, il rétablira même le mode de suivi à MKUserTrackingModeNone, ce qui correspond généralement au comportement souhaité.

+7

Une autre preuve des limites évidentes du concept de réponse acceptée. C'est la réponse qui devrait être au top! La réponse de Jacob était géniale il y a quatre ans mais maintenant complètement obsolète, elle restera pour toujours affichée comme la première réponse. – KPM