2010-10-31 4 views
1

Je dois suivre l'emplacement actuel de l'utilisateur avec un rafraîchissement en temps réel J'ai une fonction avec deux solutions pour cela.Problème de mise à jour de position d'annotation MKMapView

  • (void) LocationManager: gestionnaire (CLLocationManager *) didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation {

ifdef Variant_1

if(m_currentLocation) 
    [m_Map removeAnnotation:m_currentLocation]; 
else 
    m_currentLocation = [MKPlacemark alloc]; 
[m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil]; 
[m_Map addAnnotation:m_currentLocation]; 
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES]; 

else // Variant_2

if(m_currentLocation == nil) 
{ 
m_currentLocation = [MKPlacemark alloc]; 
[m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil]; 
[m_Map addAnnotation:m_currentLocation]; 

}else 
{ 
[m_currentLocation initWithCoordinate:newLocation.coordinate addressDictionary:nil]; 
//[m_currentLocation setCoordinate:newLocation.coordinate]; 
} 
[m_Map setCenterCoordinate:m_currentLocation.coordinate animated:YES]; 

endif

}

Variant_1 fonctionne bien, mais quand vous vous déplacez rapidement l'emplacement chanter clignote sur la carte. Variant_2 ne clignote pas mais ne bouge pas emplacement chanter mais déplace la carte. Où est le problème? Tante-toi.

Répondre

2

Dans Variant_1, il clignote probablement parce que vous effectuez une suppressionAnnotation, puis un ajoutAnnotation au lieu de simplement modifier les coordonnées de l'annotation existante. Dans Variant_2, initWithCoordinate renvoie un nouvel objet MKPlacemark avec ces coordonnées. Il ne met pas à jour les propriétés de l'objet sur lequel vous appelez la méthode. Que se passe-t-il si vous exécutez la ligne setCoordinate à la place?

Une question distincte est pourquoi ne pas utiliser la capacité intégrée de MKMapView pour afficher l'emplacement actuel de l'utilisateur? Faites simplement m_Map.showsUserLocation = YES; au début. Vous n'avez pas besoin de CLLocationManager pour obtenir l'emplacement actuel de l'utilisateur si vous utilisez MKMapView quand même.

Je pense que vous aurez toujours besoin de centrer la carte sur l'emplacement actuel de l'utilisateur en utilisant l'une des méthodes vue carte délégué:

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