Обнаружение MapView закончил изменение региона - PullRequest
0 голосов
/ 30 марта 2019

У меня есть MKMapView, который имеет аннотации.Моя цель - скрыть аннотацию, если она выбрана, когда карта закончила прокрутку.

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

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    lastSelectedAnnotation = view.annotation
}

Я знаю:

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool){ }

Однако я не могу выяснить (здесь начинающий), как определить, что карта закончила изменять свой регион, чтобы я мог вызвать свою функцию:

func hideSelectedAnnotation(_ mapView: MKMapView) {
    DispatchQueue.main.async {
        mapView.deselectAnnotation(self.lastSelectedAnnotation, animated: true)
        self.lastSelectedAnnotation = nil
    }
}

Я также скрываю аннотацию, когда нажимается дополнительная кнопка:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl){
    hideSelectedAnnotation(mapView)}

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

Спасибо за любую помощь!

1 Ответ

1 голос
/ 25 апреля 2019

Я думаю, что вы уже поняли это ...

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool){
    // Call your function here
}

Должен срабатывать каждый раз, когда изменяется область просмотра карты (если изменение не было произведено пальцем пользователя)

---- EDIT -----

К сожалению, вы должны обнаружить ввод пользователя с помощью UIPanGestureRecognizer.

Я успешно использовал UIPanGestureRecognizer, как показано ниже:

lazy var mapPanGestureRecognizer: UIPanGestureRecognizer = {
    let gr = UIPanGestureRecognizer(target: self, action: #selector(draggedMap))
    gr.delegate = self
    return gr
}()

Вы также должны будете добавить UIPanGestureRecognizer на карту с помощью

yourMap.addGestureRecognizer(mapPanGestureRecognizer)

. Затем вы можете управлять тем, что происходит в функции #selector, проверяя состояние жеста, например

@objc func draggedMap(panGestureRecognizer: UIPanGestureRecognizer) {
    // Check to see the state of the passed panGestureRocognizer
    if panGestureRecognizer.state == UIGestureRecognizer.State.began {
        // Do something
    }
}

Состояние - это то, что позволяет вам определить, закончил ли пользователь жест, находится ли он в середине жеста или начал жест. Список возможных состояний

...