Skąd mam wiedzieć, kiedy setregion na MKMapView nie zadziała regionWillChange / regionDidChange

głosy
4

Pracuję nad pewnym kodem iPhone MapKit który odpala pewne zdarzenia, gdy granice zmianie mapy (zasadniczo niektóre zapytania do serwera zewnętrznego). Jest jeszcze jedna sprawa krawędź nie wydaje się rozwiązać. Gdy użytkownicy wprowadzić nowy adres używam setRegion aby powiększyć tej lokalizacji, a potem ja obliczyć granice mapie i kwerendy mój serwer zewnętrzny z tych współrzędnych. I zawsze zadzwonić setRegion istnieje jednak jeden przypadek krawędź, gdy nie zadziała. Że jest, gdy użytkownik magicznie zdarza, aby wybrać dokładnie ten sam adres, który leży na obecnym środku mapy, kiedy że mapa jest do dokładnie tego samego regionu. Oczywiście możliwość ta jest rzadko, ale nie jest łatwo osiągalny z następującego kodu:

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

Byłoby to równoznaczne z pozwalając użytkownikowi umieścić pinezkę na środku aktualnej mapy i wystrzelić zapytanie do mojego serwera opartego na ten temat. Niestety, ponieważ logika kodu zależy od zmieniającej się w regionie (co robiłem, dzięki czemu użytkownicy mogą łatwo przesuwać po mapie i nie trzeba jawnie nacisnąć przycisk Odśwież), muszę obejść. Skąd mogę wiedzieć, kiedy setRegion została wywołana, ale to nie będzie ogień regionWillChange / regionDidChange. Mogę zastąpić funkcję jak niektórzy?

EDIT: Jak skomentował pierwszej odpowiedzi, próbowałem wykryć, kiedy region ten nie zmieni się stosując następujący kod:

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

Niestety kiedy ustawić searchLocation być w centrum aktualnej mapie uzyskać następujące wyniki:

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

W różnych przypadkach błąd jest nieco inna, ale ogólnie rzecz biorąc, nawet gdy region ten jest nieco inny jak ten setRegion lub Morever, regionDidChange, nie ogień. Czy ktoś może wyjaśnić, dlaczego? Albo jak mogę iść o wykrywaniu tego prawidłowo. Uwaga: Próbowałem też z mapView.centerCoordinate ale mam podobne błędy, a ja tylko chcę wiedzieć, kiedy region ten nie ulegnie zmianie (jeśli centerCoordinate jest taki sam poziom powiększenia / region nadal może być inny).

Utwórz 18/01/2010 o 19:02
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Poniższe kody działa dla mnie:

    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")
    }
Odpowiedział 18/04/2017 o 16:41
źródło użytkownik

głosy
0

Jest to włamał się obejście, które wydaje się działać dobrze dla mnie.

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
}

Jak już zapewne zauważyliście, Zrobiłem założenie, że dokładność po szóstym miejscu po przecinku jest zbyt nieznaczny ( do 11 mm ) do zmiany wzrokowego wymagane na mapie (nawet na najwyższym poziomie zoom).

Odpowiedział 30/09/2012 o 12:14
źródło użytkownik

głosy
0

Dlaczego nie można po prostu zadzwonić regionWill / Czy zmienić ręcznie z kodu, który jest ustawienie nowej lokalizacji na mapie, jeśli wykryje punkt byłoby ustawić mapę do byłyby obecne centrum?

Odpowiedział 18/01/2010 o 21:20
źródło użytkownik

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