Mit dem Maps SDK für iOS können Sie Ereignisse auf der Karte erfassen, z. B. Kamerawechsel- oder Markierungstipp-Ereignisse.
Einführung
Damit auf Ereignisse gewartet werden kann, müssen Sie das Protokoll GMSMapViewDelegate
implementieren. Normalerweise implementieren Sie dieses Protokoll im View Controller, in 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 Delegaten auf Ihren Ansichtscontroller festlegen. Die GMSMapViewDelegate
bietet nur optionale Methoden. Wenn Sie ein bestimmtes Ereignis beobachten 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 hören, die zum Rendern der Karte verwendet wird. Es können drei verschiedene Ereignisse auftreten.
mapView:willMove:
bedeutet, dass sich die Kameraposition gleich ändert. Wenn dasgesture
-Argument aufYES
gesetzt ist, hat ein Nutzer eine natürliche Geste auf derGMSMapView
ausgeführt, z. B. Schwenken oder Neigen. Andernfalls gibtNO
an, dass es sich um eine programmatische Änderung handelt, z. B. über Methoden wieanimateToCameraPosition:
oder durch direktes Aktualisieren der Ebene der Karte. Dies kann auchNO
sein, wenn ein Nutzer auf die Schaltfläche „Mein Standort“ oder den Kompass getippt hat. Dadurch werden Animationen generiert, die die Kamera ändern.Diese Methode kann mehrmals aufgerufen werden, bevor
mapView:idleAtCameraPosition:
aufgerufen wird. Das passiert in der Regel nur, wenn Animationen und Touch-Gesten gleichzeitig ausgeführt werden. Eine Geste bricht beispielsweise eine aktuelle Animation ab und ruftmapView:willMove:
ein zweites Mal auf.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, sobald die Kameraposition aufGMSMapView
inaktiv wird, und gibt die entsprechende Kameraposition an. An diesem Punkt finden keine Animationen und Gesten mehr statt.Mit diesem Ereignis können Anwendungen eine Aktualisierung von Markierungen oder anderen Inhalten auslösen, die auf der
GMSMapView
angezeigt werden, anstatt beispielsweise die Inhalte bei jedem Kamerawechsel neu zu laden.
Eine Anwendung kann beispielsweise die GMSMapView
bei Bewegung löschen und dann die Position, an der die Kamera zum Stillstand kommt, per Reverse-Geocoding ermitteln.
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 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 Referenzleitfaden.