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. Sie können die Farbe der Standardmarkierung ändern, das Bild der Markierung durch ein benutzerdefiniertes Symbol ersetzen oder andere Eigenschaften der Markierung ändern.
Als Reaktion auf ein Klickereignis für eine Markierung können Sie ein Infofenster öffnen. In einem Infofenster werden Texte oder Bilder in einem Pop-up-Fenster über der Markierung angezeigt. Sie können ein Standard Infofenster verwenden, um Text anzuzeigen, oder ein eigenes benutzerdefiniertes Infofenster erstellen, um dessen Inhalt vollständig zu steuern.
Markierung hinzufügen
Um eine Markierung hinzuzufügen, erstellen Sie ein GMSMarker
-Objekt mit position
und title
und legen Sie dessen map
fest.
Im folgenden Beispiel wird gezeigt, wie Sie einem vorhandenen GMSMapView
-Objekt eine Markierung hinzufügen. Die Markierung wird an den Koordinaten 10,10
erstellt. Wenn der Nutzer darauf klickt, wird der String „Hello World“ in einem Infofenster angezeigt.
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 auf der Karte animieren, indem Sie die Eigenschaft marker.appearAnimation
auf Folgendes festlegen:
kGMSMarkerAnimationPop
, damit die Markierung beim Hinzufügen aus dergroundAnchor
hervorsticht.kGMSMarkerAnimationFadeIn
, damit die Markierung beim Hinzufügen ausgeblendet wird.
Markierung entfernen
Wenn Sie eine Markierung von der Karte entfernen möchten, setzen Sie die Eigenschaft map
der GMSMarker
auf nil
. Alternativ können Sie alle Overlays, einschließlich Markierungen, entfernen, 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 Änderungen an einer Markierung vornehmen möchten, nachdem Sie sie der Karte hinzugefügt haben, muss das GMSMarker
-Objekt beibehalten werden. 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 gefä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 Standardbild der Markierung ändern möchten, können Sie mit der Eigenschaft icon
oder iconView
der Markierung ein benutzerdefiniertes Symbol festlegen.
Wenn iconView
festgelegt ist, ignoriert die API das Attribut icon
. Aktualisierungen am aktuellen icon
werden nicht erkannt, solange der iconView
festgelegt ist.
Über die Eigenschaft „icon“ der Markierung
Mit dem folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol als UIImage
in der Property icon
erstellt. Das Symbol ist auf London, England zentriert. Im Snippet wird davon ausgegangen, dass Ihre Anwendung ein Image namens „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 beim Anzeigen vieler Markierungen.
Das Bild kann mehrere Frames haben. Außerdem wird das Attribut alignmentRectInsets
berücksichtigt. Das ist nützlich, wenn eine Markierung einen Schatten oder einen anderen nicht verwendbaren Bereich hat.
Über die Property „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
ein UIView
akzeptiert, können Sie eine Hierarchie von UI-Steuerelementen festlegen, mit denen die Markierungen definiert werden. Jede Ansicht verfügt über die standardmäßigen Animationsfunktionen. Sie können Änderungen an der Größe, der Farbe und den Alphastufen der Markierung vornehmen und beliebige Transformationen anwenden. Das Attribut iconView
unterstützt die Animation aller animierten Attribute von UIView
mit Ausnahme von frame
und center
.
Beachten Sie bei der Verwendung von iconView
die folgenden Hinweise:
- Für
UIView
können Ressourcen angefordert werden, wenntracksViewChanges
aufYES
gesetzt ist. Das kann zu einer erhöhten Akkunutzung führen. Im Gegensatz dazu ist ein einzelner FrameUIImage
statisch und muss nicht neu gerendert werden. - Bei einigen Geräten ist es nicht immer möglich, die Karte zu rendern, wenn viele Markierungen auf dem Display vorhanden sind und jede Markierung eine eigene
UIView
hat und alle Änderungen gleichzeitig erfasst werden. - Ein
iconView
reagiert nicht auf eine Nutzerinteraktion, da es sich um einen Snapshot der Ansicht handelt. - Die Ansicht verhält sich so, als wäre
clipsToBounds
aufYES
gesetzt, unabhängig vom tatsächlichen Wert. Sie können Transformationen anwenden, die außerhalb der Begrenzungen funktionieren. Das Objekt, das Sie zeichnen, muss jedoch innerhalb der Grenzen des Objekts liegen. Alle Transformationen/Shifts werden überwacht und angewendet. Kurz gesagt: Unteransichten müssen in der Ansicht enthalten sein.
Bei der Entscheidung, wann das Attribut tracksViewChanges
festgelegt wird, sollten Sie die Leistungsaspekte gegen die Vorteile der automatischen Neuzeichnung der Markierung abwägen. Beispiel:
- Wenn Sie eine Reihe von Änderungen vornehmen möchten, können Sie das Attribut zu
YES
und dann wieder zuNO
ändern. - Wenn eine Animation ausgeführt wird oder die Inhalte asynchron geladen werden, sollten Sie das Attribut auf
YES
gesetzt lassen, bis die Aktionen abgeschlossen sind.
Markierungsdeckkraft ändern
Sie können die Deckkraft einer Markierung mithilfe der Eigenschaft opacity
festlegen. Geben Sie die Deckkraft als Gleitkommazahl zwischen 0.0 und 1.0 an, wobei 0 vollständige Transparenz und 1 vollständige Deckkraft bedeutet.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Mithilfe von Core Animation können Sie die Deckkraft der Markierung mithilfe von GMSMarkerLayer
animieren.
Markierung flach machen
Die Markierungssymbole werden in der Regel am Bildschirm des Geräts ausgerichtet und nicht an der Oberfläche der Karte. Daher wird durch Drehen, Neigen oder Zoomen der Karte die Ausrichtung der Markierung nicht zwangsläufig geändert.
Sie können die Ausrichtung einer Markierung aber auch so festlegen, 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. Genau 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, müssen Sie den Wert des Attributs flat
auf YES
oder true
festlegen.
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
Wenn Sie die rotation
-Eigenschaft festlegen, können Sie eine Markierung um ihren Ankerpunkt drehen. Definieren Sie die Rotation als CLLocationDegrees
-Typ, 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 Sie die Eigenschaft groundAnchor
auf 0.5,0.5
setzen, 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 bei Markierungen verarbeiten
Sie können Ereignisse erfassen, die auf der Karte auftreten, z. B. wenn ein Nutzer auf eine Markierung tippt. Wenn Sie Ereignisse beobachten möchten, müssen Sie das Protokoll GMSMapViewDelegate
implementieren. Weitere Informationen finden Sie im Leitfaden zu Ereignissen und in der Liste der Methoden in GMSMapViewDelegate
. Informationen zu Street View-Ereignissen finden Sie unter GMSPanoramaViewDelegate
.