Mit Markierungen werden einzelne Orte auf der Karte gekennzeichnet.
Für Markierungen wird standardmäßig ein Standardsymbol verwendet, das dem üblichen Google Maps-Design entspricht. Wenn Sie die Markierung anpassen möchten, können Sie die Farbe der Standardmarkierung ändern, das Bild durch ein benutzerdefiniertes Symbol ersetzen oder andere Eigenschaften der Markierung ändern.
Als Reaktion auf ein Klickereignis auf eine Markierung können Sie ein Infofenster öffnen. In einem Infofenster werden Text oder Bilder in einem Dialogfeld über der Markierung angezeigt. Sie können ein Standardinfofenster verwenden, um Text anzuzeigen, oder Ihr eigenes, benutzerdefiniertes Infofenster erstellen, um den Inhalt vollständig zu kontrollieren.
Markierung hinzufügen
Wenn Sie eine Markierung hinzufügen möchten, erstellen Sie ein GMSMarker
-Objekt, das position
und title
enthält, und legen Sie dessen map
fest.
Das folgende Beispiel zeigt, wie eine Markierung zu einem vorhandenen GMSMapView
-Objekt hinzugefügt wird. Die Markierung wird an den Koordinaten 10,10
erstellt und zeigt den String „Hello world“ in einem Infofenster an, wenn sie angeklickt wird.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.title = "Hello World" marker.map = mapView
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.title = @"Hello World"; marker.map = mapView;
Sie können das Hinzufügen neuer Markierungen zur Karte animieren, indem Sie die Eigenschaft marker.appearAnimation
auf einen der folgenden Werte setzen:
kGMSMarkerAnimationPop
, damit die Markierung beim Hinzufügen aus dergroundAnchor
entfernt wird.kGMSMarkerAnimationFadeIn
, damit die Markierung beim Hinzufügen ausgeblendet wird.
Markierung entfernen
Sie können eine Markierung von der Karte entfernen, indem Sie die map
-Eigenschaft der GMSMarker
auf nil
setzen. Alternativ können Sie alle Overlays (einschließlich Markierungen) entfernen, die sich derzeit auf der Karte befinden, indem Sie die Methode GMSMapView
clear
aufrufen.
Swift
let camera = GMSCameraPosition.camera( withLatitude: -33.8683, longitude: 151.2086, zoom: 6 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) // ... mapView.clear()
Objective-C
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683 longitude:151.2086 zoom:6]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; // ... [mapView clear];
Wenn Sie eine Markierung ändern möchten, nachdem Sie sie der Karte hinzugefügt haben, verwenden Sie das GMSMarker
-Objekt. Sie können die Markierung später über dieses Objekt ändern.
Swift
let position = CLLocationCoordinate2D(latitude: 10, longitude: 10) let marker = GMSMarker(position: position) marker.map = mapView // ... marker.map = nil
Objective-C
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10); GMSMarker *marker = [GMSMarker markerWithPosition:position]; marker.map = mapView; // ... marker.map = nil;
Markierungsfarbe ändern
Sie können die Farbe des Standardmarkierungsbilds anpassen, indem Sie mit markerImageWithColor:
eine eingefärbte Version des Standardsymbols anfordern und das resultierende Bild an die Symboleigenschaft von GMSMarker
übergeben.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Markierungsbild anpassen
Wenn Sie das Standardmarkierungsbild ändern möchten, können Sie über die Eigenschaft icon
oder iconView
der Markierung ein benutzerdefiniertes Symbol festlegen. Wenn iconView
festgelegt ist, wird das Attribut icon
von der API ignoriert.
Über die Eigenschaft icon
der Markierung
Mit dem folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol als UIImage
in der Eigenschaft icon
erstellt. Das Symbol ist auf London, England zentriert. Das Snippet geht davon aus, dass Ihre Anwendung ein Bild mit dem Namen „house.png“ enthält.
Swift
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let london = GMSMarker(position: positionLondon) london.title = "London" london.icon = UIImage(named: "house") london.map = mapView
Objective-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *london = [GMSMarker markerWithPosition:positionLondon]; london.title = @"London"; london.icon = [UIImage imageNamed:@"house"]; london.map = mapView;
Wenn Sie mehrere Markierungen mit demselben Bild erstellen, verwenden Sie für jede Markierung dieselbe Instanz von UIImage
. Dies verbessert die Leistung Ihrer Anwendung, wenn viele Markierungen angezeigt werden.
Das Bild kann mehrere Frames haben. Außerdem wird die Eigenschaft alignmentRectInsets
berücksichtigt. Dies ist nützlich, wenn eine Markierung einen Schatten oder einen anderen unbrauchbaren Bereich hat.
Über die Eigenschaft iconView
der Markierung
Mit dem folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol erstellt, indem die Eigenschaft iconView
der Markierung festgelegt wird. Außerdem wird eine Änderung der Farbe der Markierung animiert.
Im Snippet wird davon ausgegangen, dass Ihre App ein Bild namens "house.png" enthält.
Swift
import CoreLocation import GoogleMaps class MarkerViewController: UIViewController, GMSMapViewDelegate { var mapView: GMSMapView! var london: GMSMarker? var londonView: UIImageView? override func viewDidLoad() { super.viewDidLoad() let camera = GMSCameraPosition.camera( withLatitude: 51.5, longitude: -0.127, zoom: 14 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) view = mapView mapView.delegate = self let house = UIImage(named: "House")!.withRenderingMode(.alwaysTemplate) let markerView = UIImageView(image: house) markerView.tintColor = .red londonView = markerView let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let marker = GMSMarker(position: position) marker.title = "London" marker.iconView = markerView marker.tracksViewChanges = true marker.map = mapView london = marker } func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) { UIView.animate(withDuration: 5.0, animations: { () -> Void in self.londonView?.tintColor = .blue }, completion: {(finished) in // Stop tracking view changes to allow CPU to idle. self.london?.tracksViewChanges = false }) } }
Objective-C
@import CoreLocation; @import GoogleMaps; @interface MarkerViewController : UIViewController <GMSMapViewDelegate> @property (strong, nonatomic) GMSMapView *mapView; @end @implementation MarkerViewController { GMSMarker *_london; UIImageView *_londonView; } - (void)viewDidLoad { [super viewDidLoad]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5 longitude:-0.127 zoom:14]; _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; self.view = _mapView; _mapView.delegate = self; UIImage *house = [UIImage imageNamed:@"House"]; house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; _londonView = [[UIImageView alloc] initWithImage:house]; _londonView.tintColor = [UIColor redColor]; CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127); _london = [GMSMarker markerWithPosition:position]; _london.title = @"London"; _london.iconView = _londonView; _london.tracksViewChanges = YES; _london.map = self.mapView; } - (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position { [UIView animateWithDuration:5.0 animations:^{ self->_londonView.tintColor = [UIColor blueColor]; } completion:^(BOOL finished) { // Stop tracking view changes to allow CPU to idle. self->_london.tracksViewChanges = NO; }]; } @end
Da iconView
einen UIView
akzeptiert, können Sie eine Hierarchie von Standard-UI-Steuerelementen verwenden, mit denen die Markierungen definiert werden, wobei jede Ansicht die standardmäßigen Animationsfunktionen hat. Sie können Änderungen an Größe, Farbe und Alphastufen der Markierung vornehmen sowie beliebige Transformationen anwenden. Die Eigenschaft iconView
unterstützt Animationen aller animierbaren Eigenschaften von UIView
mit Ausnahme von frame
und center
.
Beachten Sie bei der Verwendung von iconView
die folgenden Hinweise:
UIView
kann Ressourcen beanspruchen, wenntracksViewChanges
aufYES
gesetzt ist. Das kann zu erhöhter Akkunutzung führen. Im Vergleich dazu ist einUIImage
-Frame für einen einzelnen Frame statisch und muss nicht noch einmal gerendert werden.- Wenn viele Markierungen auf dem Bildschirm angezeigt werden, jede Markierung eine eigene
UIView
hat und alle Markierungen gleichzeitig Änderungen erfassen, kann es auf einigen Geräten zu Problemen beim Rendern der Karte kommen. iconView
reagiert nicht auf Nutzerinteraktionen, da es sich um einen Snapshot der Ansicht handelt.- Die Ansicht verhält sich unabhängig vom tatsächlichen Wert so, als wäre
clipsToBounds
aufYES
festgelegt. Sie können Transformationen anwenden, die außerhalb der Grenzen funktionieren, aber das Objekt, das Sie zeichnen, muss sich innerhalb der Grenzen des Objekts befinden. Alle Transformationen/Verschiebungen werden überwacht und angewendet. Kurz gesagt: Unteransichten müssen in der Ansicht enthalten sein.
Bei der Entscheidung, wann die Eigenschaft tracksViewChanges
festgelegt werden soll, sollten Sie Leistungsaspekte gegen die Vorteile einer automatischen Neuzeichnung der Markierung abwägen. Beispiel:
- Falls Sie eine Reihe von Änderungen vornehmen möchten, können Sie das Attribut in
YES
und dann wieder inNO
ändern. - Wenn eine Animation ausgeführt wird oder die Inhalte asynchron geladen werden, sollten Sie das Attribut auf
YES
setzen, bis die Aktionen abgeschlossen sind.
Markierungsdeckkraft ändern
Sie können die Deckkraft einer Markierung über ihre opacity
-Eigenschaft festlegen. Sie sollten die Deckkraft als Gleitkommazahl zwischen 0,0 und 1,0 angeben, wobei 0 vollständig transparent und 1 vollständig deckend ist.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Sie können die Deckkraft der Markierung mit der [Core Animation]-Core-Animation mit GMSMarkerLayer
animieren.
Markierung vereinfachen
Markierungssymbole werden normalerweise am Display und nicht an der Kartenoberfläche ausgerichtet. Daher ändert sich durch Drehen, Neigen oder Zoomen der Karte nicht unbedingt die Ausrichtung der Markierung.
Sie können die Markierung aber auch so ausrichten, dass sie flach auf der Erdoberfläche liegt. Flache Markierungen drehen sich, wenn die Karte gedreht wird, und ändern den Blickwinkel, wenn die Karte geneigt wird. Wie normale Markierungen behalten auch flache Markierungen ihre Größe bei, wenn die Karte vergrößert oder verkleinert wird.
Um die Ausrichtung der Markierung zu ändern, setzen Sie die Eigenschaft flat
der Markierung auf YES
oder true
.
Swift
let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127) let londonMarker = GMSMarker(position: positionLondon) londonMarker.isFlat = true londonMarker.map = mapView
Objective-C
CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127); GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon]; londonMarker.flat = YES; londonMarker.map = mapView;
Markierung drehen
Mit der Eigenschaft rotation
können Sie eine Markierung um ihren Ankerpunkt drehen. Geben Sie die Drehung als Typ CLLocationDegrees
an, gemessen in Grad im Uhrzeigersinn von der Standardposition aus. Wenn die Markierung flach auf der Karte aufliegt, ist die Standardposition Norden.
Im folgenden Beispiel wird die Markierung um 90° gedreht. Wenn die Eigenschaft groundAnchor
auf 0.5,0.5
gesetzt wird, wird die Markierung um ihren Mittelpunkt statt um ihre Basis gedreht.
Swift
let degrees = 90.0 londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5) londonMarker.rotation = degrees londonMarker.map = mapView
Objective-C
CLLocationDegrees degrees = 90; londonMarker.groundAnchor = CGPointMake(0.5, 0.5); londonMarker.rotation = degrees; londonMarker.map = mapView;
Ereignisse auf Markierungen verarbeiten
Sie können auf Ereignisse warten, die auf der Karte auftreten, z. B. wenn ein Nutzer auf eine Markierung tippt. Wenn Sie auf Ereignisse warten möchten, müssen Sie das GMSMapViewDelegate
-Protokoll implementieren. Unter Markierungsereignisse und -bewegungen erfahren Sie, wie bestimmte Markierungsereignisse verarbeitet werden. Der Leitfaden zu Ereignissen enthält auch eine Liste von Methoden zu GMSMapViewDelegate. Informationen zu Street View-Ereignissen findest du unter GMSPanoramaViewDelegate
.