определить, был ли MKMapView перетащен / перемещен - PullRequest
77 голосов
/ 05 апреля 2011

Есть ли способ определить, было ли перемещено MKMapView?

Я хочу получить местоположение в центре каждый раз, когда пользователь перетаскивает карту, используя CLLocationCoordinate2D centre = [locationMap centerCoordinate];, но мне нужен метод делегата или что-то вродеЭто срабатывает, как только пользователь перемещается по карте.

Заранее спасибо

Ответы [ 15 ]

3 голосов
/ 08 февраля 2018

Ответ Яно сработал для меня, поэтому я решил оставить обновленную версию для Swift 4 / XCode 9, так как я не особо разбираюсь в Objective C, и я уверен, что есть несколько других, которые тоже не .

Шаг 1: Добавить этот код в viewDidLoad:

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didDragMap(_:)))
panGesture.delegate = self

Шаг 2: Убедитесь, что ваш класс соответствует UIGestureRecognizerDelegate:

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UIGestureRecognizerDelegate {

Шаг 3: Добавьте следующую функцию, чтобы ваш panGesture работал одновременно с другими жестами:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

Шаг 4: И убедитесь, что ваш метод не называется "50 раз за перетаскивание", как справедливо отмечает Джано:

@objc func didDragMap(_ gestureRecognizer: UIPanGestureRecognizer) {
    if (gestureRecognizer.state == UIGestureRecognizerState.ended) {
        redoSearchButton.isHidden = false
        resetLocationButton.isHidden = false
    }
}

* Обратите внимание на добавление @objc на последнем шаге. XCode навязывает этот префикс вашей функции для ее компиляции.

3 голосов
/ 27 мая 2015

Чтобы распознать, когда на просмотре карты закончился какой-либо жест:

http://b2cloud.com.au/tutorial/mkmapview-determining-whether-region-change-is-from-user-interaction/

Это очень полезно для выполнения запроса к базе данных только после того, как пользователь завершил масштабирование / поворот / перетаскивание картывокруг.

Для меня метод regionDidChangeAnimated вызывался только после того, как был сделан жест, и не вызывался много раз при перетаскивании / масштабировании / вращении, но полезно знать, произошло ли это из-за жеста.или нет.

0 голосов
/ 13 января 2019

Сначала , убедитесь, что ваш текущий контроллер представления является делегатом карты.Поэтому установите свой делегат Представления карты на себя и добавьте MKMapViewDelegate в свой контроллер представления.Пример ниже.

class Location_Popup_ViewController: UIViewController, MKMapViewDelegate {
   // Your view controller stuff
}

И добавьте это к вашему виду карты

var myMapView: MKMapView = MKMapView()
myMapView.delegate = self

Второй , добавьте эту функцию, которая запускается при перемещении карты.Он отфильтрует любые анимации и будет срабатывать только при взаимодействии с ним.

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
   if !animated {
       // User must have dragged this, filters out all animations
       // PUT YOUR CODE HERE
   }
}
0 голосов
/ 25 октября 2017

Я пытался иметь аннотацию в центре карты, которая всегда находится в центре карты, независимо от того, что делает использование. Я попробовал несколько из упомянутых выше подходов, и ни один из них не был достаточно хорош. В конце концов я нашел очень простой способ решить эту проблему, заимствуя ответ Анны и объединив его с ответом Энеко. В основном он обрабатывает regionWillChangeAnimated как начало перетаскивания, а regionDidChangeAnimated - как конец единицы и использует таймер для обновления пина в реальном времени:

var mapRegionTimer: Timer?
public func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    mapRegionTimer?.invalidate()
    mapRegionTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true, block: { (t) in
        self.myAnnotation.coordinate = CLLocationCoordinate2DMake(mapView.centerCoordinate.latitude, mapView.centerCoordinate.longitude);
        self.myAnnotation.title = "Current location"
        self.mapView.addAnnotation(self.myAnnotation)
    })
}
public func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    mapRegionTimer?.invalidate()
}
0 голосов
/ 08 ноября 2016

введите код. Мне удалось реализовать это самым простым способом, который обрабатывает все взаимодействие с картой (нажатие / двойное / N нажатие пальцами 1/2 / N, панорамирование 1/2 / N пальцами, пинч и вращения

  1. Создать gesture recognizer и добавить в контейнер вида карты
  2. Установить gesture recognizer's delegate для некоторого объекта, реализующего UIGestureRecognizerDelegate
  3. Реализация gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) метод
private func setupGestureRecognizers()
{
    let gestureRecognizer = UITapGestureRecognizer(target: nil, action: nil)
    gestureRecognizer.delegate = self
    self.addGestureRecognizer(gestureRecognizer)
}   

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
{
    self.delegate?.mapCollectionViewBackgroundTouched(self)
    return false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...