Как я знаю, когда setregion на MKMapView не будет срабатывать regionWillChange / regionDidChange

голоса
4

Я работаю над iPhone MapKit кодом, который выстреливает некоторые события, когда границы изменения карты (в основном некоторые запросы на внешний сервер). Существует один крайний случай, я не могу решить. Когда пользователь вводит новый адрес я использую setRegion, чтобы увеличить это место, а потом я вычислить пределы карты и запросить мой внешний сервер с этими координатами. Я всегда называю setRegion однако, есть один крайний случай, когда он не будет стрелять. То, есть, когда пользователь волшебно происходит выбрать тот же самый адрес, который находится в текущем центре карты, когда эта карта увеличена ровно в той же области. Конечно, эта возможность редко, но это легко достижимо с помощью следующего кода:

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

Это было бы эквивалентно позволяя пользователь уронить булавку в центре текущей карты и выпалить запрос на мой сервер, основанный на этом. К сожалению, поскольку логика кода зависит от региона меняющегося (который я сделал так, чтобы пользователи могли легко перемещаться по карте и не должны явно нажать кнопку обновления), мне нужна работа вокруг. Как я могу знать, когда setRegion был вызван, но это не будет срабатывать regionWillChange / regionDidChange. Могу ли я отменить функцию, как некоторые?

EDIT: Как я прокомментировал первый ответ, я попытался определить, когда регион не изменится, используя следующий код:

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

К сожалению, когда я поставил searchLocation быть центром текущей карты я получаю следующие результаты:

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

В разных случаях ошибка немного отличается, но, вообще говоря, даже когда область немного отличается, как этот setRegion или Morever, regionDidChange, не срабатывают. Может кто-нибудь объяснить, почему? Или как я могу идти об обнаружении этого должным образом. Примечание: Я также попытался с mapView.centerCoordinate, но я получаю подобные ошибки, и я только хочу знать, когда регион не изменится (если centerCoordinate тот же уровень масштабирования / регион по-прежнему может быть разным).

Задан 18/01/2010 в 19:02
источник пользователем
На других языках...                            


3 ответов

голоса
0

Следующие коды работают для меня:

    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")
    }
Ответил 18/04/2017 в 16:41
источник пользователем

голоса
0

Это изрубил обходной путь, который, кажется, работает хорошо для меня.

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
}

Как вы уже , наверное , заметил, я сделал предположение , что точность после шестого знака после запятой, является слишком незначительной ( до 11 мм ) для визуального изменения , которые будут требоваться на карте (даже на самом высоком уровне детализации).

Ответил 30/09/2012 в 12:14
источник пользователем

голоса
0

Почему бы вам не просто позвонить regionWill / Изменились ли вручную из кода, задающего новое местоположение на карте, если он обнаружит точку было бы установить карту будет текущий центр?

Ответил 18/01/2010 в 21:20
источник пользователем

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