2010-06-10 7 views
10

Tengo un MKMapView con un delegado registrado, así puedo escuchar los eventos de cambio de región (específicamente, regionDidChangeAnimated). Estoy buscando una manera robusta de saber si un evento de cambio de región fue el resultado de un usuario que arrastra el mapa o de una solicitud programática setRegion:.¿Cómo puedo saber cuándo el evento de cambio de región en MKMapView es programático o el arrastre del usuario de MKMapView?

Mi objetivo es tener una aplicación que centre automáticamente el mapa en función de un rastro de ubicación, a menos que el usuario haya barrido el mapa a mano, en cuyo punto se desactivará el autocentrado. Por lo tanto, estoy llamando a setRegion: para volver a centrar la vista del mapa según corresponda, pero me es difícil decir si la llamada resultante regionDidChangeAnimated: al delegado es programática o desde un usuario-pan. He intentado hackear algo juntos, pero sigo corriendo en condiciones de carrera cuando el usuario comienza a panoramizar justo cuando aparece una actualización de ubicación.

Respuesta

5

He solucionado este problema con un booleano que realiza un seguimiento de los cambios de región/centro desencadenados por código. No es la solución más elegante, pero funciona como un encanto. Es una pena que UIMapView no se derive de UIScrollView.

init:

regionChangeFromCode = FALSE; 

acción del botón:

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

centro conjunto:

-(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 
} 

y el mapa delegado:

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

Además de esto, tengo un bucle de actualización que actualiza la ubicación y llama a setCenter. Cuando se selecciona el botón, el centro del mapa lo sigue y, de lo contrario, el centro queda solo.

+0

Tuvo este problema también. Tu código es una buena solución. Es un poco hacky, pero no tan malo, ya que todavía se lee como un buen inglés. Es solo una bandera booleana :) – chakrit

Cuestiones relacionadas