Come faccio a sapere quando setregion su un MKMapView non si attiverà regionWillChange / regionDidChange

voti
4

Sto lavorando su un codice iPhone MapKit che spara alcuni eventi in cui i confini della mappa cambiano (fondamentalmente alcune query a un server esterno). C'è un caso limite che non riesco a risolvere. Quando gli utenti entrano in un nuovo indirizzo che uso setregion per ingrandire quella posizione e poi computo dei limiti della mappa e interrogare il mio server esterni con quelle coordinate. Ho sempre chiamo setregion Tuttavia, v'è un caso limite, quando non scatta mai. Che, è, quando un utente accade magicamente di selezionare lo stesso indirizzo esatto che si trova al centro corrente della mappa, quando tale mappa è ingrandita esattamente nella stessa regione. Naturalmente questa possibilità è raro ma è facile raggiungibile con il seguente codice:

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];

Questo sarebbe l'equivalente di permettere all'utente di eliminare un perno al centro della mappa corrente e sparare una query al mio server basato su quello. Purtroppo perché la logica del codice dipende dalla regione che cambia (che ho fatto in modo che gli utenti possono facilmente eseguire una panoramica la mappa, e non necessario premere esplicitamente un pulsante di aggiornamento), ho bisogno di un lavoro intorno. Come faccio a sapere quando setregion è stato chiamato, ma non voglio sparare regionWillChange / regionDidChange. Posso ignorare la funzione in qualche modo?

EDIT: Come ho commentato la prima risposta, ho cercato di rilevare quando la regione non cambierebbe utilizzando il seguente codice:

//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];

Purtroppo quando ho impostato il searchLocation ad essere il centro della mappa corrente ottengo i seguenti risultati:

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

In diversi casi l'errore è leggermente diverso ma in generale anche quando la regione è leggermente diverso come questo setregion o inoltre non deve essere, regionDidChange, non sparare. Qualcuno può spiegare perché? O come potrei andare sul rilevamento questo modo corretto. Nota: ho provato anche con mapView.centerCoordinate ma ottengo errori simili, e voglio solo sapere quando la regione non cambierà (se il centerCoordinate è lo stesso del livello di zoom / regione può ancora essere diverso).

È pubblicato 18/01/2010 alle 19:02
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

I seguenti codici funziona per me:

    let predictRect = mapView.convertRegion(mapView.regionThatFits(THE_REGION_YOU_WANT_TO_SET), toRectTo: mapView)

    if predictRect.origin.x.rounded() == 0 && predictRect.origin.y.rounded() == 0
        && predictRect.size.width.rounded() == mapView.bounds.width
        && predictRect.size.height.rounded() == mapView.bounds.height
    {
        debugPrint("setRegion same, will not trigger region change event")
    }
Risposto il 18/04/2017 a 16:41
fonte dall'utente

voti
0

Si tratta di una soluzione hacked up che sembra funzionare bene per me.

MKCoordinateRegion currentRegion = mapView.region;

// Capture the instances where setRegion will not be fired
BOOL regionLatitudeSame = (int)(currentRegion.center.latitude*1000000) == (int)(region.center.latitude*1000000);
BOOL regionLongitudeSame = (int)(currentRegion.center.longitude*1000000) == (int)(region.center.longitude*1000000);
BOOL regionSame = regionLatitudeSame && regionLongitudeSame;
if (regionSame)
{
    // Safe to assume that regionWillChange/regionDidChange WON'T be called
}

Come probabilmente avete notato, ho fatto l'ipotesi che la precisione dopo la sesta cifra decimale è di gran lunga troppo insignificante ( fino a 11 mm ) per un cambiamento visivo da richiedere sulla mappa (anche al suo più alto livello di zoom).

Risposto il 30/09/2012 a 12:14
fonte dall'utente

voti
0

Perché non basta chiamare regionWill / Ha modificare manualmente dal codice che sta mettendo la nuova mappa di localizzazione se rileva il punto sarebbe impostare la mappa per sarebbe il centro di corrente?

Risposto il 18/01/2010 a 21:20
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more