Hoe weet ik wanneer setregion op MKMapView niet zal bij brand regionWillChange / regionDidChange

stemmen
4

Ik ben bezig met een aantal iPhone MapKit code die vuurt een aantal evenementen als de grenzen van de kaart te veranderen (in feite enkele vragen naar een externe server). Er is een rand geval ik kan niet lijken op te lossen. Wanneer gebruikers een nieuw adres gebruik ik setRegion om in te zoomen op die locatie en daarna bereken ik de grenzen van de kaart en opvragen via mijn externe server met die coördinaten. Ik roep altijd setRegion is er echter één rand geval wanneer het niet zal ontslaan. Dat wil zeggen, wanneer een gebruiker op magische wijze gebeurt om de exacte hetzelfde adres, dat ligt op de huidige midden van de kaart, wanneer die kaart is ingezoomd op precies dezelfde regio te selecteren. Natuurlijk is deze mogelijkheid is zeldzaam, maar het is gemakkelijk bereikbaar met de volgende code:

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

Dit zou het equivalent van het toestaan ​​van de gebruiker om een ​​pin te laten vallen in het midden van de huidige kaart en Vuur een query naar mijn server op basis van dat. Helaas omdat de code logica is afhankelijk van de regio te veranderen (die ik heb gedaan, zodat gebruikers gemakkelijk kunnen over de kaart en niet expliciet druk op de refresh-knop), ik heb een werk rond. Hoe kan ik weten wanneer setRegion is genoemd, maar het zal niet afgaan regionWillChange / regionDidChange. Kan ik de functie wat hoe overschrijven?

EDIT: Zoals ik op het eerste antwoord merkte, heb ik geprobeerd om te detecteren wanneer de regio niet zou veranderen met behulp van de volgende code:

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

Helaas toen ik de searchLocation naar het midden van de huidige kaart ik de volgende resultaten te krijgen:

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 andere gevallen is de fout is iets anders maar in het algemeen, zelfs als de regio is iets anders als deze setRegion of Voorts mogen regionDidChange, niet vuren. Kan iemand uitleggen waarom? Of hoe ik kan gaan over het opsporen van deze goed. Let op: Ik heb ook geprobeerd met mapView.centerCoordinate maar ik krijg soortgelijke fouten, en ik wil alleen te weten wanneer de regio zal niet veranderen (als de centerCoordinate hetzelfde is het zoomniveau / regio kan nog steeds verschillen).

De vraag is gesteld op 18/01/2010 om 19:02
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

De volgende codes werkt voor mij:

    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")
    }
antwoordde op 18/04/2017 om 16:41
bron van user

stemmen
0

Dit is een gehackte up oplossing die lijkt goed te werken voor mij.

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
}

Zoals je waarschijnlijk al gemerkt, heb ik de veronderstelling dat de nauwkeurigheid na de zesde cijfer achter de komma is veel te onbeduidend (gemaakt tot 11 mm ) voor een visuele verandering te verplichten op de kaart (zelfs op het hoogste zoomniveau).

antwoordde op 30/09/2012 om 12:14
bron van user

stemmen
0

Waarom ga je niet gewoon bellen regionWill / Bedoelde handmatig wijzigen van de code die is het instellen van de nieuwe locatie op de kaart als het het punt zou de kaart ingesteld op zou het huidige centrum zijn ontdekt?

antwoordde op 18/01/2010 om 21:20
bron van user

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