Как я могу узнать, когда событие regionChange в MKMapView является программным или перетаскиванием MKMapView пользователем?

У меня есть MKMapView с зарегистрированным делегатом, поэтому я могу прослушивать события изменения региона (в частности, regionDidChangeAnimated). Я ищу надежный способ узнать, было ли событие изменения региона результатом перетаскивания карты пользователем или программным setRegion: запросом.

Моя цель - создать приложение, которое автоматически центрирует карту на основе трассировки местоположения, если пользователь не панорамировал карту вручную, после чего автоматическое центрирование отключится. Таким образом, я вызываю setRegion: для повторного центрирования представления карты по мере необходимости, но мне трудно определить, является ли результирующий regionDidChangeAnimated: вызов делегата программным или из пользовательского панорамирования. Я пробовал что-то взломать вместе, но продолжаю сталкиваться с условиями гонки, когда пользователь начинает панорамирование, как только приходит обновление местоположения.


person Brian Ferris    schedule 10.06.2010    source источник


Ответы (1)


Я исправил эту проблему с помощью логического значения, которое отслеживает изменения области / центра, запускаемые кодом. Не самое элегантное решение, но работает как шарм. Жаль, что UIMapView не является производным от UIScrollView.

в этом:

regionChangeFromCode = FALSE;

действие кнопки:

-(IBAction) butCenterPressed:(id)sender
{   
    butCenter.selected = !butCenter.selected;       
    if(butCenter.selected)  
        [self setCenter];
}

установить центр:

-(void) setCenter
{
    regionChangeFromCode = TRUE; //before setCenterCoordinate, otherwise this is FALSE in regionWillChangeAnimated
    [theMap setCenterCoordinate:[self calcCenter]]; //this could also be [theMap setRegion]. Works the same
}

и делегат карты:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    if(!regionChangeFromCode) //so a user did it
    {
        if(butCenter.selected)
            butCenter.selected = FALSE;
    }
    regionChangeFromCode = FALSE;
}

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

person RickyA    schedule 10.03.2011
comment
Была и эта проблема. Ваш код - хорошее решение. Это немного взломано, но не так уж плохо, поскольку по-прежнему читается как хороший английский. Это всего лишь один логический флаг :) - person chakrit; 21.02.2012