Ereignisse

Plattform auswählen: Android iOS JavaScript

Mit dem Maps SDK for iOS können Sie auf Ereignisse auf der Karte warten, z. B. auf Kameraänderungen oder auf das Tippen auf Markierungen.

Einführung

Wenn Sie auf Ereignisse warten möchten, müssen Sie das GMSMapViewDelegate-Protokoll implementieren. Normalerweise implementieren Sie dieses Protokoll auf dem Ansichts-Controller, mit dem die Karte angezeigt wird. Ein Beispiel dafür sehen Sie unten:

Swift

import GoogleMaps

class Events: UIViewController, GMSMapViewDelegate {
  // ...
}
      

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

Nachdem die GMSMapView erstellt wurde, können Sie ihren Bevollmächtigten an Ihren Ansichts-Controller festlegen. GMSMapViewDelegate stellt nur optionale Methoden bereit. Wenn Sie auf ein bestimmtes Ereignis warten möchten, müssen Sie die entsprechende Methode implementieren.

Swift

override func loadView() {
  super.loadView()
  let camera = GMSCameraPosition.camera(
    withLatitude: 1.285,
    longitude: 103.848,
    zoom: 12
  )
  let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
  mapView.delegate = self
  self.view = mapView
}

// MARK: GMSMapViewDelegate

func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
  print("You tapped at \(coordinate.latitude), \(coordinate.longitude)")
}
      

Objective-C

- (void)loadView {
  [super loadView];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285
                                                          longitude:103.848
                                                               zoom:12];
  GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  mapView.delegate = self;
  self.view = mapView;
}

#pragma mark - GMSMapViewDelegate

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
  NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude);
}
      

Kameraposition

Mit GMSMapViewDelegate können Sie Änderungen an der Kameraposition beobachten, die zum Rendern der Karte verwendet wird. Es können drei verschiedene Ereignisse auftreten.

  • mapView:willMove: zeigt an, dass sich die Kameraposition ändern wird. Wenn das Argument gesture auf YES gesetzt ist, bedeutet dies, dass der Nutzer eine natürliche Geste für GMSMapView ausführt, z. B. zum Schwenken oder Neigen. Andernfalls gibt NO an, dass dies Teil einer programmatischen Änderung ist, z. B. über Methoden wie animateToCameraPosition: oder durch direktes Aktualisieren der Kartenebene. Dieser Wert kann auch NO sein, wenn ein Nutzer auf die Schaltfläche „Mein Standort“ oder die Kompassschaltfläche getippt hat, die Animationen generieren, durch die die Kamera gewechselt wird.

    Diese Methode kann mehrmals aufgerufen werden, bevor mapView:idleAtCameraPosition: aufgerufen wird. Normalerweise geschieht dies jedoch nur, wenn Animationen und Gesten gleichzeitig auftreten. Eine Geste bricht beispielsweise alle aktuellen Animationen ab und ruft mapView:willMove: ein zweites Mal auf.

  • mapView:didChangeCameraPosition: wird während einer Geste oder Animation wiederholt aufgerufen, immer nach einem Aufruf von mapView:willMove:. Dabei wird die dazwischenliegende Kameraposition übergeben.

  • Schließlich wird mapView:idleAtCameraPosition: aufgerufen, sobald die Kameraposition auf GMSMapView inaktiv wird, und gibt die entsprechende Kameraposition an. An diesem Punkt finden keine Animationen und Gesten mehr statt.

    Anwendungen können dieses Ereignis verwenden, um eine Aktualisierung von Markierungen oder anderen Inhalten auszulösen, die in GMSMapView angezeigt werden, anstatt z. B. den Inhalt bei jeder Kameraänderung neu zu laden.

Eine Anwendung kann beispielsweise das GMSMapView-Element bei der Bewegung löschen und dann die Position, auf die die Kamera schließlich zeigt, umgekehrt geocodieren.

Swift

let geocoder = GMSGeocoder()

func mapView(_ mapView: GMSMapView, willMove gesture: Bool) {
  mapView.clear()
}

func mapView(_ mapView: GMSMapView, idleAt cameraPosition: GMSCameraPosition) {
    geocoder.reverseGeocodeCoordinate(cameraPosition.target) { (response, error) in
      guard error == nil else {
        return
      }

      if let result = response?.firstResult() {
        let marker = GMSMarker()
        marker.position = cameraPosition.target
        marker.title = result.lines?[0]
        marker.snippet = result.lines?[1]
        marker.map = mapView
      }
    }
  }
      

Objective-C

GMSGeocoder *geocoder;

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture {
  [mapView clear];
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)cameraPosition {
  id handler = ^(GMSReverseGeocodeResponse *response, NSError *error) {
    if (error != nil) {
      return;
    }
    GMSReverseGeocodeResult *result = response.firstResult;
    GMSMarker *marker = [GMSMarker markerWithPosition:cameraPosition.target];
    marker.title = result.lines[0];
    marker.snippet = result.lines[1];
    marker.map = mapView;
  };
  [geocoder reverseGeocodeCoordinate:cameraPosition.target completionHandler:handler];
}
      

Ereignisse bei Unternehmen und anderen POIs

Standardmäßig werden Points of Interest (POIs) zusammen mit ihren Icons auf der Karte dargestellt. POIs sind beispielsweise Parks, Schulen, Behördengebäude und mehr sowie Wirtschaftsunternehmen wie Geschäfte, Restaurants oder Hotels.

Sie können auf Klickereignisse auf einen POI reagieren. Weitere Informationen findest du im Leitfaden zu Unternehmen und anderen POIs.

Weitere Ereignisse

Eine vollständige Liste der Methoden für GMSMapViewDelegate finden Sie in der Referenzdokumentation.