Hvordan vet jeg når setregion på en MKMapView ikke vil fyre regionWillChange / regionDidChange

stemmer
4

Jeg jobber med noen iPhone MapKit kode som fyrer av noen hendelser når grensene til kartbytte (i utgangspunktet noen forespørsler til en ekstern server). Det er en kant tilfelle jeg kan ikke synes å løse. Når brukere angi en ny adresse bruker jeg setRegion å zoome inn på det stedet og etterpå jeg beregne grensene av kartet og spørre meg ekstern server med disse koordinatene. Jeg har alltid ringe setRegion men det er en kant tilfelle når det ikke vil brann. Det er når en bruker magisk som skjer for å velge nøyaktig samme adresse som ligger på dagens midt på kartet, når det kartet er zoomet til nøyaktig samme region. Selvfølgelig denne muligheten er sjelden, men det er lett oppnåelig med følgende kode:

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

Dette ville være det samme som tillater brukeren å slippe en pinne i midten av det gjeldende kartet og fyre av en forespørsel til serveren min basert på det. Dessverre fordi koden logikk avhenger av regionen endring (som jeg har gjort, slik at brukerne enkelt kan panorere rundt på kartet og ikke trenger å eksplisitt trykker på en oppdateringsknappen), jeg trenger en omgå. Hvordan kan jeg vite når setRegion har blitt kalt, men det vil ikke fyre regionWillChange / regionDidChange. Kan jeg overstyre funksjonen noen hvordan?

EDIT: Som jeg kommenterte det første svaret, jeg prøvde å oppdage når regionen ikke ville endre ved hjelp av følgende kode:

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

Dessverre når jeg setter searchLocation å være i sentrum av den gjeldende kart jeg får følgende resultater:

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

I ulike tilfeller feilen er litt forskjellig, men generelt sett, selv når området er litt annerledes som dette setRegion eller morever, regionDidChange, ikke brann. Kan noen forklare hvorfor? Eller hvordan jeg kunne gå om å oppdage dette riktig. Merk: Jeg har også prøvd med mapView.centerCoordinate men jeg får samme feil, og jeg ønsker bare å vite når området ikke vil endre (hvis centerCoordinate er den samme zoomnivået / region kan likevel være forskjellig).

Publisert på 18/01/2010 klokken 18:02
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Følgende koder fungerer for meg:

    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")
    }
Svarte 18/04/2017 kl. 16:41
kilden bruker

stemmer
0

Dette er en hacket opp midlertidig løsning som ser ut til å fungere godt for meg.

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
}

Som du sikkert har lagt merke til, har jeg gjort under forutsetning av at nøyaktigheten etter den sjette desimalen er altfor ubetydelig ( opptil 11 mm ) for en visuell endring til å være nødvendig på kartet (selv på sitt høyeste zoomnivå).

Svarte 30/09/2012 kl. 11:14
kilden bruker

stemmer
0

Hvorfor ikke bare kalle regionWill / Visste endre manuelt fra koden som setter den nye kartposisjonen hvis den oppdager det punktet det ville sette kartet til å ville være den nåværende sentrum?

Svarte 18/01/2010 kl. 20:20
kilden bruker

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