Estoy trabajando en un código iPhone MapKit que dispara a algunos eventos cuando los límites del mapa se modifican (básicamente algunas consultas a un servidor externo). Hay un caso extremo me parece que no puede resolver. Cuando los usuarios entran en una nueva dirección que utilizo setRegion hacer zoom en ese lugar y después puedo calcular los límites del mapa y Query mi servidor externo con esas coordenadas. Siempre me llaman setRegion Sin embargo, hay un caso extremo, cuando no se disparará. Eso, es decir, cuando un usuario pasa mágicamente para seleccionar la misma dirección exacta que se encuentra en el centro actual del mapa, cuando ese mapa se reduce a exactamente la misma región. Por supuesto, esta posibilidad es poco frecuente pero es fácil de lograr con el siguiente código:
CLLocation *centerOfMap = [[CLLocation alloc] initWithLatitude:mapView.centerCoordinate.latitude longitude:mapView.centerCoordinate.longitude];
mySearchLocation.searchLocation = centerOfMap;
//Recenter and zoom map in on search location
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[self.mapView setRegion:region animated:YES];
Esto sería el equivalente de permitir al usuario dejar caer un alfiler en el centro del mapa actual y disparar una consulta a mi servidor basado en eso. Por desgracia, porque la lógica del código depende de cambiar la región (que he hecho para que los usuarios puedan desplazarse fácilmente por el mapa y no tener que pulsar un botón de actualización de forma explícita), necesito un trabajo alrededor. ¿Cómo puedo saber cuándo setRegion se ha llamado pero no va a disparar regionWillChange / regionDidChange. ¿Puedo reemplazar la función de alguna forma?
EDIT: Como me comentó en la primera respuesta, traté de detectar cuando la región no cambiaría utilizando el siguiente código:
//Recenter and zoom map in on search location
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center = mySearchLocation.searchLocation.coordinate;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
region = [mapView regionThatFits:region]; //Not sure if this is necessary
NSLog(@diff in latitude of center %f, (mapView.region.center.latitude - region.center.latitude));
NSLog(@diff in longitude of center %f, (mapView.region.center.longitude - region.center.longitude));
NSLog(@diff in latitude span %f, (mapView.region.span.latitudeDelta - region.span.latitudeDelta));
NSLog(@diff in longitude span %f, (mapView.region.span.longitudeDelta - region.span.longitudeDelta));
[self.mapView setRegion:region animated:YES];
Por desgracia, cuando me puse la searchLocation a ser el centro del mapa actual consigo los siguientes resultados:
diff in latitude of center 0.000000
diff in longitude of center 0.000016
diff in latitude span -0.000000
diff in longitude span 0.000000
En diferentes casos el error es ligeramente diferente pero en general, incluso cuando la región es ligeramente diferente como esto setRegion o morever, regionDidChange, no se dispara. ¿Alguien puede explicar por qué? O cómo podría ir sobre la detección de este adecuadamente. Nota: También probé con mapView.centerCoordinate pero me da errores similares, y yo sólo quiero saber cuando la región no cambiará (si el centerCoordinate es lo mismo el nivel de zoom / región todavía puede ser diferente).













