Ereignisse

Plattform auswählen: Android iOS JavaScript

Mit dem Maps SDK for iOS können Sie auf Ereignisse warten, die auf der Karte auftreten, beispielsweise Kamerawechsel- oder Markierungstipp-Ereignisse.

Einführung

Damit auf Ereignisse gewartet werden kann, müssen Sie das Protokoll GMSMapViewDelegate implementieren. Normalerweise tun Sie dies für den Ansichts-Controller, der die Karte anzeigt. Ein Beispiel dafür sehen Sie unten:

Swift

import GoogleMaps

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

Objective-C

@import GoogleMaps;

@interface Events : UIViewController <GMSMapViewDelegate>

@end
      

Wenn der GMSMapView erstellt wird, können Sie seinen Delegaten auf Ihren Ansichts-Controller festlegen. GMSMapViewDelegate bietet nur optionale Methoden. 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 options = GMSMapViewOptions()
  options.camera = camera
  let mapView = GMSMapView(options: options)
  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];
  GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
  options.camera = camera;
  GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options];
  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 dem GMSMapViewDelegate können Sie Änderungen an der Kameraposition erfassen, die zum Rendern der Karte verwendet wird. Es können drei verschiedene Ereignisse auftreten.

  • mapView:willMove: gibt an, dass sich die Kameraposition gleich ändert. Wenn das Argument gesture auf YES gesetzt ist, liegt das daran, dass ein Nutzer eine natürliche Geste auf der GMSMapView ausgeführt hat, z. B. Schwenken oder Neigen. Andernfalls gibt NO an, dass es sich um eine programmatische Änderung handelt, z. B. über Methoden wie animateToCameraPosition: oder durch direktes Aktualisieren der Kartenebene. Der Wert kann auch NO sein, wenn ein Nutzer auf die Schaltfläche „Mein Standort“ oder „Kompass“ getippt hat. Dadurch werden Animationen generiert, die die Kamera ändern.

    Diese Methode kann mehrmals aufgerufen werden, bevor mapView:idleAtCameraPosition: aufgerufen wird. Dies geschieht jedoch in der Regel nur, wenn Animationen und Gesten gleichzeitig auftreten. Eine Geste bricht beispielsweise jede aktuelle Animation 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:. Die Zwischenposition der Kamera wird übergeben.

  • Schließlich wird mapView:idleAtCameraPosition: aufgerufen, sobald die Kameraposition auf GMSMapView inaktiv wird, und die relevante Kameraposition wird angegeben. 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 auf der GMSMapView angezeigt werden, anstatt beispielsweise die Inhalte bei jeder Kameraänderung neu zu laden.

Eine Anwendung kann beispielsweise das GMSMapView bei einer Bewegung löschen und dann die Position, an der die Kamera zum Stillstand kommt, 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

static 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 Click-Events auf einen POI reagieren. Weitere Informationen finden Sie im Leitfaden zu Unternehmen und anderen POIs.

Weitere Ereignisse

Eine vollständige Liste der Methoden für GMSMapViewDelegate finden Sie im Referenzhandbuch.