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

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

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

Ответ 1

Я исправил эту проблему с помощью логического, которое отслеживает изменения кода/центра, вызванного кодом. Не самое изящное решение, но оно работает как шарм. Это позор. 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. Когда выбрана кнопка, центр карты следует, а в остальном центр остается один.