Wie kann ich wissen, wenn setRegion auf einem MKMapView nicht regionWillChange / regionDidChange Feuer

stimmen
4

Ich arbeite an einigen iPhone MapKit Code, der einige Ereignisse feuert, wenn die Grenzen der Karte ändern (im Grunde einige Abfragen an einen externen Server). Es gibt eine Kante Fall, dass ich nicht zu lösen scheinen kann. Wenn Benutzer eine neue Adresse eingeben verwende ich setRegion an dieser Stelle zu vergrößern und danach berechnen ich die Grenzen der Karte und Abfrage meiner externen Server mit diesen Koordinaten. Ich nenne setRegion immer jedoch gibt es eine Kante Fall, wenn es wird nicht ausgelöst. Das ist, wenn ein Benutzer geschieht magisch genau die gleiche Adresse auszuwählen, die in der aktuellen Mitte der Karte liegt, wenn die Karte auf genau die gleiche Region gezoomt wird. Natürlich ist diese Möglichkeit selten, aber es ist leicht erreichbar mit dem folgenden 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];

Dies wäre das Äquivalent der Benutzer ermöglicht, einen Stift in der Mitte der aktuellen Karte zu löschen und eine Abfrage auf meinen Server basiert auf dem abfeuern. Leider, da die Code-Logik auf der Region hängt zu ändern (was ich getan habe, so dass Benutzer leicht um die Karte verschieben und nicht explizit einen Refresh-Button drücken müssen), ich brauche um eine Arbeit. Wie kann ich wissen, wann setRegion aufgerufen wurde, aber es wird nicht regionWillChange / regionDidChange abzufeuern. Kann ich die Funktion einige, wie außer Kraft setzen?

EDIT: Wie ich auf der ersten Antwort kommentiert, habe ich versucht, zu erkennen, wenn die Region nicht mit dem folgenden Code ändern:

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

Leider, wenn ich die searchLocation gesetzt die Mitte der aktuellen Karte zu sein, habe ich die folgenden Ergebnisse erhalten:

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 verschiedenen Fällen ist der Fehler leicht unterschiedlich, aber allgemein gesprochen, auch wenn die Region wie diese setRegion etwas anders ist oder morever, regionDidChange, wird nicht ausgelöst. Kann mir jemand erklären, warum? Oder wie könnte ich mich über diese richtig zu erkennen. Hinweis: Ich habe auch mit mapView.centerCoordinate versucht, aber ich ähnliche Fehler zu bekommen, und ich möchte nur wissen, wann der Region wird sich nicht ändern (wenn die centerCoordinate die gleiche ist der Zoomstufe / Region noch unterschiedlich sein).

Veröffentlicht am 18/01/2010 um 19:02
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Die folgenden Codes funktioniert für mich:

    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")
    }
Beantwortet am 18/04/2017 um 16:41
quelle vom benutzer

stimmen
0

Dies ist eine zerhackt Abhilfe, die für mich gut zu funktionieren scheint.

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
}

Wie Sie wahrscheinlich bemerkt haben, habe ich die Annahme, dass die Genauigkeit nach der sechsten Dezimalstelle viel zu unbedeutend ist ( bis zu 11 mm ) für eine optische Veränderung auf der Karte benötigt werden (auch auf der höchsten Zoomstufe).

Beantwortet am 30/09/2012 um 12:14
quelle vom benutzer

stimmen
0

Warum gehst du nicht einfach anrufen regionWill / Haben manuell aus dem Code ändern, der die neue Karte Lage setzt, wenn er den Punkt erkennt wäre es die Karte gesetzt würde das aktuelle Zentrum sein?

Beantwortet am 18/01/2010 um 21:20
quelle vom benutzer

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