Можно ли постоянно отслеживать регион MKMapView при прокрутке/масштабировании?

Я хотел бы постоянно обновлять свой пользовательский интерфейс в соответствии с MKMapView, когда пользователь масштабирует или прокручивает карту. (Это работает нормально не только после окончания прокрутки.)

Я попробовал метод делегата mapView:regionWillChangeAnimated:, который, согласно документации, «вызывается всякий раз, когда изменяется отображаемый в данный момент регион карты. Во время прокрутки этот метод может вызываться много раз, чтобы сообщать об обновлениях позиции на карте». https://developer.apple.com/documentation/mapkit/mkmapviewdelegate

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [self updateUIAcordingToMapViewRegionChange];
}

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

Единственный пост об этой проблеме, который мне удалось найти, принадлежит участнику macrumors namanhams: http://forums.macrumors.com/showthread.php?t=1225172 Но никто не придумал никаких идей...

В качестве обходного пути я попытался установить таймер в regionWillChange (и сделать его недействительным в regionDidChange):

- (void)handleRegionChange:(NSTimer*)timer
{
   [self updateUIAcordingToMapViewRegionChange];
} 

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                    target:self
                                                  selector:@selector(handleRegionChange:)
                                                  userInfo:nil
                                                   repeats:YES];
}

Но и это не работает. Все вызовы методов из таймера выполняются сразу после окончания прокрутки.Похоже, прокрутка mapView блокирует основной поток или что-то в этом роде…

Я также читал этот пост на stackoverflow, но, к сожалению, не совсем его понял: Отслеживание событий перерисовки MKMapView Поэтому, если решение моей проблемы действительно лежит в этом SO-потоке, скажите мне об этом, и я попытаюсь вникнуть в его детали.

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

8
задан Cœur 27 March 2019 в 13:56
поделиться