Mit dem Maps SDK for iOS können Sie auf Ereignisse auf der Karte warten, z. B. Kameraänderungsereignisse oder das Antippen von Markierungen.
Einleitung
Wenn Sie auf Ereignisse warten möchten, müssen Sie das GMSMapViewDelegate
-Protokoll implementieren. Normalerweise 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
Wenn das GMSMapView
erstellt wurde, können Sie seinen Bevollmächtigten an Ihren View-Controller übergeben. 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 der Kameraposition erfassen, 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 Argumentgesture
aufYES
gesetzt ist, bedeutet dies, dass der Nutzer eine natürliche Geste auf demGMSMapView
ausführt, z. B. Schwenken oder Neigen. Andernfalls gibtNO
an, dass dies Teil einer programmatischen Änderung ist, z. B. über Methoden wieanimateToCameraPosition:
oder durch direktes Aktualisieren der Kartenebene. Dieser kann auchNO
sein, wenn ein Nutzer auf die Schaltfläche „Mein Standort“ oder die Kompassschaltfläche getippt hat, durch die Animationen generiert werden, durch die die Kamera verändert wird.Diese Methode kann mehrmals vor dem Aufrufen von
mapView:idleAtCameraPosition:
aufgerufen werden. Normalerweise geschieht dies jedoch nur, wenn Animationen und Touch-Gesten gleichzeitig ausgeführt werden. Durch eine Geste wird z. B. die aktuelle Animation abgebrochen undmapView:willMove:
ein zweites Mal aufgerufen.mapView:didChangeCameraPosition:
wird während einer Geste oder Animation wiederholt aufgerufen, immer nach dem Aufruf vonmapView:willMove:
. Dabei wird die Kamera-Zwischenposition übergeben.mapView:idleAtCameraPosition:
wird aufgerufen, sobald die Kameraposition aufGMSMapView
inaktiv wird, und gibt die entsprechende Kameraposition an. An diesem Punkt finden keine Animationen und Gesten mehr statt.Apps können dieses Ereignis verwenden, um eine Aktualisierung von Markierungen oder anderen Inhalten auszulösen, die im
GMSMapView
angezeigt werden, anstatt beispielsweise den Inhalt bei jeder Kameraänderung neu zu laden.
Eine Anwendung kann beispielsweise das GMSMapView
bei einer Bewegung löschen und dann die Position, auf die die Kamera zum Positionieren 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
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.