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).













