2010-10-27 7 views
1

J'ai le code suivant à la place:MapKit - Niveau de zoom maintient la réinitialisation

-(void)viewDidLoad 
{ 
    //Set Zoom level using Span 
    MKCoordinateSpan span; 
    span.latitudeDelta = 0.05; 
    span.longitudeDelta = 0.05; 
    region.span = span; 
} 


-(void)locationChange:(CLLocation *)newLocation: (CLLocation *)oldLocation 
{ 
    // This zooms in on the users current loation. 
    curlocation = newLocation.coordinate; 
    region.center = curlocation; 

    [_mapView setRegion:region animated:TRUE]; 
} 

Dans un premier temps le niveau de zoom est défini selon le code viewDidLoad. Comment enregistrer l'ID de niveau de zoom que l'utilisateur effectue un zoom avant ou arrière, car chaque fois qu'une nouvelle mise à jour d'emplacement est reçue, le niveau de zoom est réinitialisé.

Existe-t-il un moyen de détecter si l'utilisateur a effectué un zoom avant ou arrière?

MISE À JOUR

J'ai ajouter la méthode regionDidChangeAnimated comme suit:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    NSLog(@"Region DID change. Center is now %f,%f, Deltas=%f,%f", 
      region.center.latitude, region.center.longitude, 
      region.span.latitudeDelta, region.span.longitudeDelta); 
} 

sortie dans le journal ressemble:

2010-11-01 15: 17: 29,317 Legginit [2948: 307] Modification de la région DID.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

2010-11-01 15: 17: 30,553 Legginit [2948: 307] did changement.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

2010-11-01 15: 17: 31,063 Legginit [2948: 307] did changement.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

2010-11-01 15: 17: 31,653 Legginit [2948: 307] did changement.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

2010-11-01 15: 17: 32,582 Legginit [2948: 307] did changement.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

2010-11-01 15: 17: 33,608 Legginit [2948: 307] did changement.
Center est maintenant 54,181150, -8,483177, deltas = 0.050000,0.050000

Comme je l'ai un zoom avant sur le téléphone que j'attendais les valeurs Delta de changer, mais ils restent à 0,05. Suis-je mal comprendre comment cela fonctionne. J'ai pensé que je pourrais capturer les valeurs Delta et les stocker afin que je puisse réinitialiser le niveau de zoom si l'utilisateur quitte et rentre dans la carte.

Cordialement, Stephen

Répondre

2

En locationChange, essayez de mettre à jour la durée de votre région pour la durée actuelle du _mapView avant d'appeler setRegion:

region.span = _mapView.region.span; 

Si vous avez vraiment besoin de détecter les changements de zoom comme ils se produisent, mettre en œuvre la MKMapViewDelegate méthode regionWillChangeAnimated ou regionDidChangeAnimated.

Edit:
Vous devez obtenir la nouvelle région du Mapview et de définir votre variable d'instance de la région à elle (la vue sur la carte ne sera pas définir votre variable d'instance automatiquement):

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    region = mapView.region; //<-- add this 

    NSLog(@"Region DID change. Center is now %f,%f, Deltas=%f,%f", 
      region.center.latitude, region.center.longitude, 
      region.span.latitudeDelta, region.span.longitudeDelta); 
} 
+0

aBitObvious, je suis passé à l'utilisation de regionWillChangeAnimated. J'ai mis à jour ma question ci-dessus, pourriez-vous jeter un coup d'œil si vous avez une minute. Je ne pense pas comprendre exactement comment cela fonctionne. – Stephen

+0

J'ai mis à jour la réponse. – Anna

0

lieu d'utiliser la région, il suffit de changer les coordonnées du centre. J'ai trouvé que le réglage de la région elle-même peut légèrement modifier le niveau de zoom, même en disant à mapView d'utiliser la même région que la mapView actuelle.

[_mapView setCenterCoordinate:newLocation.coordinate animated:YES]; 
Questions connexes