Mit Markierungen werden einzelne Orte auf der Karte gekennzeichnet.
Standardmäßig wird für Markierungen 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 Markierungsbild durch ein benutzerdefiniertes Symbol ersetzen oder andere Eigenschaften der Markierung ändern.
Als Reaktion auf ein Click-Event auf eine Markierung können Sie ein Infofenster öffnen. In einem Infofenster werden Texte oder Bilder in einem Dialogfenster über der Markierung angezeigt. Sie können ein Standardinfofenster verwenden, um Text anzuzeigen, oder ein eigenes benutzerdefiniertes Infofenster erstellen, um den Inhalt vollständig zu steuern.
Markierung hinzufügen
Um eine Markierung hinzuzufügen, erstellen Sie ein GMSMarker
-Objekt, das eine position
und eine title
enthält, und legen Sie die map
fest.
Das folgende Beispiel zeigt, wie einem vorhandenen GMSMapView
-Objekt eine Markierung hinzugefügt wird. Die Markierung wird an den Koordinaten 10,10
erstellt. Wenn darauf geklickt wird, erscheint der String „Hello world“ in einem Infofenster.
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 demgroundAnchor
herausspringt.kGMSMarkerAnimationFadeIn
, damit die Markierung beim Hinzufügen eingeblendet wird.
Markierung entfernen
Sie können eine Markierung von der Karte entfernen, indem Sie die map
-Eigenschaft des 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, muss das Objekt GMSMarker
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 standardmäßigen Markierungsbilds anpassen, indem Sie mit markerImageWithColor:
eine getönte Version des Standardsymbols anfordern und das resultierende Bild an die „icon“-Eigenschaft 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 ein benutzerdefiniertes Symbol festlegen. Verwenden Sie dazu die Eigenschaft icon
oder iconView
der Markierung. Wenn iconView
festgelegt ist, ignoriert die API die Property icon
.
icon
-Eigenschaft der Markierung verwenden
Im folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol erstellt, das als UIImage
in der Eigenschaft icon
angegeben wird. Das Symbol ist auf London, England zentriert. Im Snippet wird davon ausgegangen, 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
. Dadurch wird die Leistung Ihrer Anwendung verbessert, wenn viele Markierungen angezeigt werden.
Das Bild kann mehrere Frames haben. Außerdem wird die alignmentRectInsets
-Property berücksichtigt, was nützlich ist, wenn ein Marker einen Schatten oder einen anderen unbrauchbaren Bereich hat.
iconView
-Eigenschaft der Markierung verwenden
Im folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol erstellt, indem die iconView
-Eigenschaft 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 Standard-UI-Steuerelementen für Ihre Markierungen erstellen. Jede Ansicht hat die Standardanimationsfunktionen. Sie können Änderungen an der Größe, Farbe und den Alphawerten der Markierungen vornehmen sowie beliebige Transformationen anwenden. Die iconView
-Property unterstützt die Animation aller animierbaren Properties von UIView
, mit Ausnahme von frame
und center
.
Beachten Sie bei der Verwendung von iconView
Folgendes:
- Die
UIView
kann ressourcenintensiv sein, wenntracksViewChanges
aufYES
eingestellt ist. Das kann zu einem erhöhten Akkuverbrauch führen. Im Vergleich dazu ist ein einzelner FrameUIImage
statisch und muss nicht neu gerendert werden. - Bei einigen Geräten kann es zu Problemen beim Rendern der Karte kommen, wenn viele Markierungen auf dem Bildschirm angezeigt werden, jede Markierung ein eigenes
UIView
hat und alle Markierungen gleichzeitig Änderungen erfassen. - Ein
iconView
reagiert nicht auf Nutzerinteraktionen, 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 Grenzen liegen, aber das Objekt, das Sie zeichnen, muss innerhalb der Grenzen des Objekts liegen. Alle Transformationen/Verschiebungen werden überwacht und angewendet. Kurz gesagt: Unteransichten müssen in der Ansicht enthalten sein. - Wenn Sie
-copyWithZone:
fürGMSMarker
verwenden möchten, müssen SieGMSMarker
zuerst kopieren und dann eine neue Instanz voniconView
für die Kopie festlegen.UIView
unterstütztNSCopying
nicht, daher kanniconView
nicht kopiert werden.
Bei der Entscheidung, wann die tracksViewChanges
-Eigenschaft festgelegt werden soll, sollten Sie die Leistungsaspekte gegen die Vorteile abwägen, die sich aus dem automatischen Neuzeichnen des Markers ergeben. Beispiel:
- Wenn Sie mehrere Änderungen vornehmen möchten, können Sie die Eigenschaft auf
YES
und dann wieder aufNO
ändern. - Wenn eine Animation ausgeführt wird oder die Inhalte asynchron geladen werden, sollten Sie die Eigenschaft auf
YES
lassen, bis die Aktionen abgeschlossen sind.
Deckkraft der Markierung ändern
Sie können die Deckkraft einer Markierung mit der Eigenschaft opacity
ändern. Die Deckkraft sollte als Gleitkommazahl zwischen 0,0 und 1,0 angegeben werden, wobei 0 für vollständig transparent und 1 für vollständig undurchsichtig steht.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Sie können die Deckkraft der Markierung mit Core Animation und GMSMarkerLayer
animieren.
Markierung flach darstellen
Markierungssymbole werden üblicherweise am Bildschirm des Geräts und nicht an der Oberfläche der Karte ausgerichtet. Deshalb ändert sich ihre Ausrichtung nicht unbedingt, wenn die Karte gedreht, geneigt oder gezoomt wird.
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. Genau wie reguläre 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 der Eigenschaft 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
Mit der Eigenschaft rotation
können Sie festlegen, dass sich eine Markierung um ihren Ankerpunkt drehen soll. Geben Sie die Drehung als CLLocationDegrees
-Typ an. Sie wird in Grad im Uhrzeigersinn von der Standardposition aus gemessen. 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
festlegen, wird sie um ihre Mitte statt um ihre Grundlinie 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 für Markierungen verarbeiten
Sie können auf Ereignisse warten, die auf der Karte auftreten, z. B. wenn ein Nutzer auf eine Markierung tippt. Damit auf Ereignisse gewartet werden kann, müssen Sie das Protokoll GMSMapViewDelegate
implementieren. Informationen zum Umgang mit bestimmten Markierungsereignissen finden Sie unter Markierungsereignisse und ‑gesten. Die Anleitung zu Ereignissen enthält auch eine Liste von Methoden für GMSMapViewDelegate. Informationen zu Street View-Veranstaltungen finden Sie unter GMSPanoramaViewDelegate
.