Mit dem Maps SDK for iOS können Sie Ereignisse erfassen, die auf der Karte auftreten, z. B. Ereignisse durch Kameraänderung oder das Antippen von Markierungen.
Einführung
Wenn Sie Ereignisse beobachten möchten, müssen Sie das Protokoll GMSMapViewDelegate
implementieren. In der Regel implementieren Sie dieses Protokoll auf dem 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
Beim Erstellen von GMSMapView
können Sie den Bevollmächtigten 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 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:
bedeutet, dass sich die Kameraposition demnächst ändern wird. Wenn das Argumentgesture
aufYES
gesetzt ist, liegt das daran, dass ein Nutzer eine natürliche Geste inGMSMapView
ausführt, z. B. zum Schwenken oder Neigen. Andernfalls zeigtNO
an, dass dies Teil einer programmatischen Änderung ist, z. B. über Methoden wieanimateToCameraPosition:
oder das direkte Aktualisieren der Kartenebene. Der Wert kann auchNO
lauten, wenn ein Nutzer auf die Schaltfläche „Mein Standort“ oder die Kompassschaltfläche getippt hat. Dadurch werden Animationen erstellt, die die Kamera verändern.Diese Methode kann mehrmals aufgerufen werden, bevor
mapView:idleAtCameraPosition:
aufgerufen wird. Das ist aber normalerweise nur dann der Fall, wenn Animationen und Gesten gleichzeitig stattfinden. Mit einer Geste wird beispielsweise die aktuelle Animation abgebrochen undmapView:willMove:
ein zweites Mal aufgerufen.mapView:didChangeCameraPosition:
wird während einer Geste oder Animation wiederholt aufgerufen, immer nach einem Aufruf vonmapView:willMove:
. Es wird die Zwischenkameraposition übergeben.Schließlich wird
mapView:idleAtCameraPosition:
aufgerufen, wenn die Kameraposition aufGMSMapView
inaktiv wird, und gibt die entsprechende Kameraposition an. An diesem Punkt finden keine Animationen und Gesten mehr statt.In diesem Fall können Anwendungen eine Aktualisierung von Markierungen oder anderen Inhalten auslösen, die auf
GMSMapView
angezeigt werden, anstatt die Inhalte beispielsweise bei jeder Kameraänderung neu zu laden.
Zum Beispiel kann eine Anwendung das GMSMapView
bei einer Bewegung löschen und dann den geocodierten Ort der Ruheposition umkehren.
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 finden Sie in der Anleitung zu Unternehmen und anderen POIs.
Weitere Ereignisse
Eine vollständige Liste der Methoden in GMSMapViewDelegate
findest du im Referenzhandbuch.