Как вы измеряете, как далеко сдвинулась карта? - PullRequest
1 голос
/ 28 мая 2011

В моем методе mapView: regionDidChangeAnimated я звоню, чтобы найти места на карте, но я хочу звонить только в том случае, если карта переместилась на значительную сумму.

Вот сценарий:

  1. Пользователь перемещает карту или карту загрузки
  2. HTTP-звонок для поиска мест
  3. Добавить места на карту.
  4. ПРОБЛЕМА! Пользователь нажимает на аннотацию, открывающую пузырь заголовка, и он приближается к краю, поэтому перемещает карту. Поскольку загрузка данных связана с событием перемещения карты, маркер исчезает и снова добавляется.

Как я должен следить за диапазоном и центральной точкой для изменения?

@ Скотт Спасибо за идею visibleMapRect. Это то, над чем я работаю до сих пор, но все равно необходимо учитывать увеличение и уменьшение масштаба.

MKMapRect newRect = _mapView.visibleMapRect;
MKMapRect oldRect = currentRect;

float leftBoundry = (newRect.origin.x-(newRect.size.width/4));
float rightBoundry = (newRect.origin.x+(newRect.size.width/4));    
float topBoundry = (newRect.origin.y-(newRect.size.height/4));
float bottomBoundry = (newRect.origin.y+(newRect.size.height/4));

NSLog(@"Origin x %f, y %f", oldRect.origin.x, oldRect.origin.y);
NSLog(@"Boundries left %f, top %f, right %f, bottom %f", leftBoundry, topBoundry, rightBoundry, bottomBoundry);    

if (oldRect.origin.x < leftBoundry || oldRect.origin.x > rightBoundry || oldRect.origin.y < topBoundry || oldRect.origin.y > bottomBoundry) {
    [self loadLocations];
    currentRect = newRect;
}

1 Ответ

1 голос
/ 28 мая 2011

Хм. Похоже, что вы обновляете свою карту, удаляя все аннотации, а затем (повторно) отображая все аннотации, попадающие в visibleMapRect - и решение этой проблемы может потребовать более детального подхода к обновлению карты.

Один из подходов может заключаться в использовании MKMapRectIntersection для определения перекрытия между вашими "старыми" и "новыми" visibleMapRect с, и (если он есть) исключает возможность удаления или повторного добавления аннотаций в этом регионе. , Или вы можете рассчитать L-образную область, которая прокручивается на экране, и выполнять только HTML-вызов для данных в этой области.

Или вы можете просто проверить, находится ли «старый» центр карты в пределах visibleMapRect, и, если это так, произвольно решить, что карта не сдвинулась на значительную величину. Это может привести к тому, что на экране появятся области, которые должны иметь аннотации, но, тем не менее,

Или, наконец, вы можете просто сохранить координату выбранной пользователем аннотации, и, если эта координата все еще отображается на экране после перемещения карты, найдите ее и повторно выберите аннотацию.

...