2010-09-08 17 views
4

J'ai ce code pour définir la carte à l'emplacement de l'utilisateur:Pourquoi MKMapView me met-il à la mer?

MKCoordinateSpan span; 
span.latitudeDelta=0.2; 
span.longitudeDelta=0.2; 

CLLocationCoordinate2D location=mapView.userLocation.coordinate; 
location = mapView.userLocation.location.coordinate; 

MKCoordinateRegion region; 
region.span=span; 
region.center=location; 

[mapView setRegion:region animated:TRUE]; 
[mapView regionThatFits:region]; 

Maintenant, quand je fais mapView.showsUserLocation=YES il montre ma position au bon endroit (sur mon appareil, et la hq de pomme dans le simulateur) cependant, Les deux fois le code ci-dessus me met dans la mer quelque part près de l'Afrique!

Des idées?

+1

Avez-vous vérifié que 'mapView.userLocation.location' n'est pas nul? – FelixLam

+0

non ... je devine que l'emplacement n'a pas encore été ajouté à la carte? –

Répondre

14

La paire latitude/longitude 0/0 se trouve sur l'équateur au sud de Greenwich, en Angleterre. Cet endroit se trouve dans le golfe de Guinée, au large de la côte ouest de l'Afrique. Si c'est là que votre pin est placé, votre mapView.userLocation n'est pas défini. Probablement que votre code ici est en cours d'exécution avant que MKMapKit ait eu la chance d'obtenir son emplacement. Qu'est-ce que vous voulez vraiment faire est d'avoir votre viewController adopter le protocole MKMapKitDelegate, définissez la propriété .delegate de votre point de vue sur la carte à self, puis mettre en œuvre la méthode:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 

Cette méthode sera appelé lorsque le kit de carte localise la utilisateur, et vous pouvez utiliser la valeur userLocation que vous avez passé ici pour définir la région sur la carte. Cependant, jusqu'à ce que cela soit appelé la première fois, le MapView travaille toujours à se localiser, et votre question concernant sa localisation est prématurée.

En outre, votre régionThatFits à la fin est un no-op. Cette méthode ne redimensionne pas la région en place, elle renvoie effectivement une région redimensionnée, pour que vous puissiez l'utiliser comme vous le souhaitez. Vous voulez donc définir la région de votre vue cartographique sur ce que cette méthode renvoie. Comme ceci:

[mapView setRegion:[mapView regionThatFits:region] animated:TRUE]; 
+0

fantastique. :) Je vous remercie –

0

Vous pouvez choisir cette méthode ..

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated{ 

CLGeocoder *ceo = [[CLGeocoder alloc]init]; 
CLLocation *loc = [[CLLocation alloc]initWithLatitude:_mapView.region.center.latitude longitude:_mapView.region.center.longitude]; 
CLLocationAccuracy accuracy = _mapView.userLocation.location.horizontalAccuracy; 

if (accuracy) { 
    current_pickup_location = loc; 
    [_currentStreetSpinner startAnimating]; 
    [ceo reverseGeocodeLocation:loc 
       completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error){ 
        CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
        NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; 
        //     NSLog(@"location %@",placemark.location); 
        NSLog(@"I am currently at %@",locatedAt); 
        _currentStreetLabel.text = locatedAt; 
        static_iVar = _currentStreetLabel.text; 
        [_currentStreetSpinner stopAnimating]; 
        [self listDoctorsWithSpeciality_id:currentSpeciality_id 
           withProfessionalityId:currentProfessionality_id]; 
       }]; 
} 

0

Je réponds à cette question parce que la réponse choisie ne m'a pas vraiment aidé et j'avais exactement le même problème. didUpdateUserLocation n'est pas très pratique car il permet à l'application de se mettre à jour chaque fois que l'emplacement change. L'autre problème avec la solution ci-dessus est que lorsque la carte se charge, il est encore trop tôt pour demander un emplacement. Alors, comment demandez-vous l'emplacement de l'utilisateur avant le chargement de la carte afin que le zoom ne vous emmène pas en Afrique?

Vous devez demander l'emplacement en utilisant le gestionnaire d'emplacement sur viewDidLoad. Ensuite, après cela, vous pouvez définir la région.

SWIFT 3

//top of your class 
    let locManger = CLLocationManager() 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     //request user location 
     locManager.startUpdatingLocation() 


     //this is the code that sets the region based on the location 

     let span = MKCoordinateSpanMake(0.5, 0.5) 

     let location = CLLocationCoordinate2DMake((locManager.location?.coordinate.latitude)!, (locManager.location?.coordinate.longitude)!) 

     let region = MKCoordinateRegionMake(location, span) 

     yourMap.setRegion(region, animated: false) 


     //stop location updating 
     locManager.stopUpdatingLocation() 
}