2010-06-10 12 views
10

Ho un MKMapView con un delegato registrato in modo da poter ascoltare gli eventi di cambio regione (in particolare, regionDidChangeAnimated). Sto cercando un modo efficace per dire se un evento di cambio regione è il risultato di un utente che trascina la mappa o da una richiesta di programmazione setRegion:.Come posso sapere quando l'evento regionChange su MKMapView è programmato o trascinato dall'utente di MKMapView?

Il mio obiettivo è quello di avere un'app che auto-centra la mappa in base a una traccia di posizione, a meno che l'utente non abbia spostato la mappa manualmente, a quel punto si spegnerà automaticamente l'autocentraggio. Pertanto, sto chiamando setRegion: per ripristinare la visualizzazione della mappa come appropriato, ma ho difficoltà a capire se la chiamata regionDidChangeAnimated: risultante al delegato è programmatica o da un riquadro utente. Ho provato a hackerare qualcosa insieme, ma continuo a correre in condizioni di gara quando l'utente inizia a panning proprio quando arriva un aggiornamento di posizione.

risposta

5

Ho risolto questo problema con un booleano che tiene traccia delle modifiche regione/centro attivate dal codice. Non è la soluzione più elegante, ma funziona come un fascino. È un peccato che UIMapView non derivi da UIScrollView.

init:

regionChangeFromCode = FALSE; 

azione pulsante:

-(IBAction) butCenterPressed:(id)sender 
{ 
    butCenter.selected = !butCenter.selected;  
    if(butCenter.selected) 
     [self setCenter]; 
} 

centro insieme:

-(void) setCenter 
{ 
    regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated 
    [theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same 
} 

e la mappa delegato:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    if(!regionChangeFromCode) //so a user did it 
    { 
     if(butCenter.selected) 
      butCenter.selected = FALSE; 
    } 
    regionChangeFromCode = FALSE; 
} 

In aggiunta a questo ho un ciclo di aggiornamento che aggiorna la posizione e chiama setCenter. Quando il pulsante è selezionato, il centro della mappa segue, e in caso contrario il centro viene lasciato in pace.

+0

Aveva anche questo problema. Il tuo codice è una buona soluzione. È un po 'hacky, ma non così male visto che si legge ancora come un buon inglese. È solo una bandiera booleana :) – chakrit