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

242voto

Jano Punkte 61585

Der Code in der akzeptierten Antwort wird ausgelöst, wenn der Bereich aus irgendeinem Grund geändert wird. Um ein Ziehen der Karte richtig zu erkennen, müssen Sie einen UIPanGestureRecognizer hinzufügen. Dies ist übrigens der Erkenner der Ziehgesten (Schwenken = Ziehen).

Schritt 1: Fügen Sie den Gestenerkenner in viewDidLoad hinzu:

-(void) viewDidLoad {
    [super viewDidLoad];
    UIPanGestureRecognizer* panRec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didDragMap:)];
    [panRec setDelegate:self];
    [self.mapView addGestureRecognizer:panRec];
}

Schritt 2: Fügen Sie das Protokoll UIGestureRecognizerDelegate zum View-Controller hinzu, damit es als Delegat funktioniert.

@interface MapVC : UIViewController <UIGestureRecognizerDelegate, ...>

Schritt 3: Und fügen Sie den folgenden Code für den UIPanGestureRecognizer hinzu, um mit den bereits vorhandenen Gestenerkennern in MKMapView zu arbeiten:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

Schritt 4: Wenn Sie Ihre Methode nur einmal statt 50 Mal pro Ziehen aufrufen möchten, erkennen Sie den Zustand "Ziehen beendet" in Ihrem Selektor:

- (void)didDragMap:(UIGestureRecognizer*)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded){
        NSLog(@"drag ended");
    }
}

79voto

Snowman Punkte 30417

Dies ist die einzige Methode, die bei mir funktioniert hat und die sowohl vom Benutzer initiierte Schwenk- als auch Zoomänderungen erkennt:

- (BOOL)mapViewRegionDidChangeFromUserInteraction
{
    UIView *view = self.mapView.subviews.firstObject;
    //  Look through gesture recognizers to determine whether this region change is from user interaction
    for(UIGestureRecognizer *recognizer in view.gestureRecognizers) {
        if(recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateEnded) {
            return YES;
        }
    }

    return NO;
}

static BOOL mapChangedFromUserInteraction = NO;

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    mapChangedFromUserInteraction = [self mapViewRegionDidChangeFromUserInteraction];

    if (mapChangedFromUserInteraction) {
        // user changed map region
    }
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (mapChangedFromUserInteraction) {
        // user changed map region
    }
}

32voto

hEADcRASH Punkte 1805

(Nur die) Swift-Version von @mobi's ausgezeichnete Lösung :

private var mapChangedFromUserInteraction = false

private func mapViewRegionDidChangeFromUserInteraction() -> Bool {
    let view = self.mapView.subviews[0]
    //  Look through gesture recognizers to determine whether this region change is from user interaction
    if let gestureRecognizers = view.gestureRecognizers {
        for recognizer in gestureRecognizers {
            if( recognizer.state == UIGestureRecognizerState.Began || recognizer.state == UIGestureRecognizerState.Ended ) {
                return true
            }
        }
    }
    return false
}

func mapView(mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    mapChangedFromUserInteraction = mapViewRegionDidChangeFromUserInteraction()
    if (mapChangedFromUserInteraction) {
        // user changed map region
    }
}

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if (mapChangedFromUserInteraction) {
        // user changed map region
    }
}

20voto

dst3p Punkte 1008

Swift 3 Lösung für Jano's Antwort oben:

Fügen Sie das Protokoll UIGestureRecognizerDelegate zu Ihrem ViewController hinzu

class MyViewController: UIViewController, UIGestureRecognizerDelegate

Erstellen Sie den UIPanGestureRecognizer in viewDidLoad und setzen delegate zu sich selbst

viewDidLoad() {
    // add pan gesture to detect when the map moves
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.didDragMap(_:)))

    // make your class the delegate of the pan gesture
    panGesture.delegate = self

    // add the gesture to the mapView
    mapView.addGestureRecognizer(panGesture)
}

Fügen Sie eine Protokollmethode hinzu, damit Ihr Gestenerkenner mit den vorhandenen MKMapView-Gesten funktioniert

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

Fügen Sie die Methode hinzu, die durch den Selektor in Ihrer Pan-Geste aufgerufen wird

func didDragMap(_ sender: UIGestureRecognizer) {
    if sender.state == .ended {

        // do something here

    }
}

18voto

Sehen Sie sich die MKMapViewDelegate Hinweis.

Insbesondere können diese Methoden nützlich sein:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

Stellen Sie sicher, dass die Delegate-Eigenschaft Ihrer Kartenansicht so eingestellt ist, dass diese Methoden aufgerufen werden.

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