2011-02-06 9 views
6

He leído y seguido las instrucciones en How do I zoom an MKMapView to the users current location without CLLocationManager?¿Cómo se puede centrar visualmente el mapa MKMapView cuando se conoce o cambia la ubicación del usuario?

Sin embargo, aunque obtengo la ubicación actual del usuario, no puedo hacer que el mapa se centre visualmente allí.

Por ejemplo, en la función viewDidLoad, ¿cómo puedo hacer que el mapa se centre visualmente alrededor de la ubicación conocida de los usuarios? He pegado el código de CurrentLocation a continuación (Ver el comentario XXX en viewDidLoad


#import "MapViewController.h" 
#import "PlacemarkViewController.h" 

@implementation MapViewController 

@synthesize mapView, reverseGeocoder, getAddressButton; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // XXX HERE: How can I cause self.mapView to actually recenter itself at self.mapview.userLocation.location? 


    mapView.showsUserLocation = YES; 
} 

- (void)viewDidUnload 
{ 
    self.mapView = nil; 
    self.getAddressButton = nil; 
} 

- (void)dealloc 
{ 
    [reverseGeocoder release]; 
    [mapView release]; 
    [getAddressButton release]; 

    [super dealloc]; 
} 

- (IBAction)reverseGeocodeCurrentLocation 
{ 
    self.reverseGeocoder = 
     [[[MKReverseGeocoder alloc] initWithCoordinate:mapView.userLocation.location.coordinate] autorelease]; 
    reverseGeocoder.delegate = self; 
    [reverseGeocoder start]; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error 
{ 
    NSString *errorMessage = [error localizedDescription]; 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Cannot obtain address." 
                 message:errorMessage 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
    [alertView show]; 
    [alertView release]; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark 
{ 
    PlacemarkViewController *placemarkViewController = 
     [[PlacemarkViewController alloc] initWithNibName:@"PlacemarkViewController" bundle:nil]; 
    placemarkViewController.placemark = placemark; 
    [self presentModalViewController:placemarkViewController animated:YES]; 
} 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    // we have received our current location, so enable the "Get Current Address" button 
    [getAddressButton setEnabled:YES]; 
} 

@end 

Respuesta

26

Parece que sólo tiene que utilizar la propiedad centerCoordinate del MKMapView class - los documentos dicen:

El cambio del valor de esta propiedad centra el mapa en la nueva coordenada sin cambiar el nivel de zoom actual. También actualiza los valores en la propiedad region para reflejar la nueva coordenada central y los nuevos valores de span necesarios para mantener el nivel de zoom actual.

Así que, básicamente, sólo lo hacen:

self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
+1

le gustaría que sea '' mapView.userLocation.coordinate' o mapView.userLocation.location.coordinate'. La propiedad centerCoordinate es del tipo 'CLLocationCoordinate2D'. – Anurag

+0

¡Buena captura, Anurag! Fijo. – Tim

+0

Gracias chicos. Así que haciendo self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate; no funciona desde ViewDidLoad. Funciona en otro lugar (como cuando se hace dentro de reverseGeocodeCurrentLocation) - DT –

Cuestiones relacionadas