Piccolo tips della settimana: zoomare la mappa sulla posizione dell’utente. Esigenza molto comune ma non così semplice da realizzare come sembra. Infatti anche se è possibile sfruttare la proprietà userLocation della classe MKMapView questa potrebbe non essere valorizzata in fase di load della view. Questo è naturale in quanto per ottenere la posizione dell’utente ci possono volere alcuni secondi in base alla disponibiltà del sistema GPS. Come fare allora ad effettuare uno zoom quando la posizione dell’utente è disponibile? In questo modo:
- (void)viewDidLoad { [super viewDidLoad]; // imposto il controller come delegate della mappa self.mapView.delegate = self; // chiedo alla mappa di visualizzare la posizione del device // questa operazione potrebbe durare qualche secondo self.mapView.showUserLocation = YES; } // questo metodo è invocato ogni volta che una (o più) // annotation view è aggiunta alla mappa, compresa // l'annotazione che rappresenta la posizione del device -(void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views { for(MKAnnotationView *annotationView in views) { if(annotationView.annotation == self.mapView.userLocation) { MKCoordinateRegion region; MKCoordinateSpan span; span.latitudeDelta = 0.15; span.longitudeDelta = 0.15; region.span = span; region.center = self.mapView.userLocation.location.coordinate; [self.mapView setRegion:region animated:YES]; [self.mapView regionThatFits:region]; } } }
In pratica sfruttando il metodo didAddAnnotationViews è possibile intercettare quando la posizione dell’utente è visualizzata sulla mappa ed effettuare uno zoom solo quando è necessario. Il tutto senza l’uso del CLLocationManager, il che ci risparmia un pò di codice che, a mio avviso, risulterebbe ridondante.