92 Stimmen

feststellen, ob MKMapView gezogen/verschoben wurde

Gibt es eine Möglichkeit festzustellen, ob ein MKMapView herumgezogen wurde?

Ich möchte die zentrale Position jedes Mal, wenn ein Benutzer die Karte zieht mit CLLocationCoordinate2D centre = [locationMap centerCoordinate]; aber ich bräuchte eine Delegate-Methode oder etwas, das ausgelöst wird, sobald der Benutzer auf der Karte navigiert.

Vielen Dank im Voraus

5voto

BossOz Punkte 505

Ich weiß, dies ist ein alter Beitrag, aber hier mein Swift 4/5 Code von Jano's Antwort mit den Gesten Pan und Pinch.

class MapViewController: UIViewController, MapViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.didDragMap(_:)))
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(self.didPinchMap(_:)))
        panGesture.delegate = self
        pinchGesture.delegate = self
        mapView.addGestureRecognizer(panGesture)
        mapView.addGestureRecognizer(pinchGesture)
    }

}

extension MapViewController: UIGestureRecognizerDelegate {

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

    @objc func didDragMap(_ sender: UIGestureRecognizer) {
        if sender.state == .ended {
            //code here
        }
    }

    @objc func didPinchMap(_ sender: UIGestureRecognizer) {
        if sender.state == .ended {
            //code here
        }
    }
}

Viel Spaß!

4voto

Roma Punkte 1087

Sie können nach animierten Eigenschaften suchen wenn false, dann hat der Benutzer die Karte gezogen

 func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if animated == false {
        //user dragged map
    }
}

1voto

Gadzair Punkte 1211

Ich wollte eine Anmerkung in der Mitte der Karte haben, die sich immer in der Mitte der Karte befindet, egal, was die Benutzer tun. Ich habe mehrere der oben genannten Ansätze ausprobiert, aber keiner von ihnen war gut genug. Ich habe schließlich eine sehr einfache Lösung gefunden, die sich an Annas Antwort anlehnt und mit Enekos Antwort kombiniert wurde. Es behandelt im Grunde die regionWillChangeAnimated als den Beginn eines ziehen, und regionDidChangeAnimated als das Ende eines, und verwendet einen Timer, um die Pin in Echtzeit zu aktualisieren:

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()
}

0voto

Code hier eingebenIch habe es geschafft, dies auf die einfachste Art und Weise zu implementieren, die alle Interaktionen mit der Karte handhabt (Tippen/Doppel-N-Tippen mit 1/2/N-Fingern, Schwenken mit 1/2/N-Fingern, Kneifen und Drehen

  1. erstellen. gesture recognizer und zum Container der Kartenansicht hinzufügen
  2. Satz gesture recognizer's delegate zu einem Objekt, das UIGestureRecognizerDelegate
  3. Umsetzung gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) méthode
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
}

-1voto

Liam Bolling Punkte 134

Erste Stellen Sie sicher, dass Ihr aktueller View-Controller ein Delegierter der Karte ist. Setzen Sie also Ihren Map View Delegate auf self und fügen Sie MKMapViewDelegate zu Ihrem View-Controller. Beispiel unten.

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

Und fügen Sie dies zu Ihrer Kartenansicht hinzu

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

Zweite fügen Sie diese Funktion hinzu, die ausgelöst wird, wenn die Karte verschoben wird. Sie filtert alle Animationen heraus und wird nur ausgelöst, wenn mit ihr interagiert wird.

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
   if !animated {
       // User must have dragged this, filters out all animations
       // PUT YOUR CODE HERE
   }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X