Me gustaría actualizar mi interfaz de usuario de acuerdo con un MKMapView continuamente cuando el usuario amplía o se desplaza por el mapa. (No solo después de que el desplazamiento ha finalizado, eso funciona bien.)¿Es posible realizar un seguimiento continuo de la región MKMapView mientras se desplaza/acerca al zoom?
Probé el método delegado mapView: regionWillChangeAnimated: que, de acuerdo con la documentación, "se invoca cada vez que cambia la región del mapa mostrada actualmente. Durante el desplazamiento, este método puede ser llamado muchas veces para informar actualizaciones a la posición del mapa ". http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
[self updateUIAcordingToMapViewRegionChange];
}
Pero lamentablemente esto no funciona porque la documentación no parece estar diciendo la verdad. El método solo se llama una vez al comienzo del cambio de región. Durante el desplazamiento, mientras el dedo está hacia abajo y se mueve, el método nunca se vuelve a llamar.
El único post sobre este problema que pude encontrar fue por MacRumors namanhams miembros: http://forums.macrumors.com/showthread.php?t=1225172 Pero nadie se le ocurrió alguna idea ...
Como solución intenté establecer un temporizador en regionWillChange (e invalidar en regionDidChange):
- (void)handleRegionChange:(NSTimer*)timer
{
[self updateUIAcordingToMapViewRegionChange];
}
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(handleRegionChange:)
userInfo:nil
repeats:YES];
}
Pero eso tampoco funciona. Todas las llamadas a métodos desde el temporizador se ejecutan todas a la vez justo después de que el desplazamiento haya finalizado. Parece que el desplazamiento de la MAPview está bloqueando el hilo principal o algo ...
también leí este post en stackoverflow, pero, lamentablemente, no entiendo por completo: Monitor MKMapView redraw events Así que si la solución a mi problema radica en el hecho de que SO- hilo, por favor díganmelo, y trato de profundizar en sus detalles.
Aún espero ser simplemente demasiado estúpido o ciego para encontrar el método de delegado correcto, y realmente aprecio cualquier sugerencia, solución alternativa y mejores prácticas para lidiar con el seguimiento de la región MKMapView.
Gracias!
Gracias! Pensé que esto era exactamente lo que probé (vea el segundo fragmento de código más arriba). Lo que hice mal fue: guardé el temporizador en una propiedad, pero a diferencia de mi fragmento de código (que cambié por "hacerlo más corto y claro") lo estaba creando en el getter solo si la variable de instancia no era nula. Pero invalidar el temporizador no establece la propiedad en cero, así que supongo que siempre estaba agregando un viejo temporizador invalidado al runloop cuando mi mapView cambió la región ... – Goodsquirrel