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

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

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

1 Ответ

5 голосов
/ 10 марта 2011

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

init:

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.При нажатии кнопки следует центр карты, в противном случае центр остается один.

...