Mit Markierungen werden einzelne Orte auf der Karte gekennzeichnet.
Für Markierungen wird standardmäßig ein Standardsymbol im üblichen Google Maps-Design verwendet. Wenn Sie die Markierung anpassen möchten, können Sie die Farbe der Standardmarkierung ändern, das Bild der Markierung durch ein benutzerdefiniertes Symbol ersetzen oder andere Eigenschaften der Markierung ändern.
Als Reaktion auf ein Click-Event für eine Markierung können Sie ein Infofenster öffnen. In einem Infofenster werden in einem Dialogfeld über der Markierung Text oder Bilder angezeigt. Sie können ein Standardinfofenster verwenden, um Text anzuzeigen, oder ein eigenes benutzerdefiniertes Infofenster erstellen, um seinen Inhalt vollständig zu steuern.
Markierung hinzufügen
Um eine Markierung hinzuzufügen, erstellen Sie ein GMSMarker
-Objekt, das ein position
und ein title
enthält, 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 und zeigt in einem Infofenster den String „Hello world“ 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 Folgendes festlegen:
kGMSMarkerAnimationPop
, damit die Markierung beim Hinzufügen aus ihremgroundAnchor
herausragt.kGMSMarkerAnimationFadeIn
, damit die Markierung beim Hinzufügen einblendet.
Markierung entfernen
Sie können eine Markierung von der Karte entfernen, indem Sie die Eigenschaft map
der GMSMarker
auf nil
setzen. Alternativ können Sie alle Overlays (einschließlich Markierungen) auf der Karte entfernen, indem Sie die GMSMapView
-Methode 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. Dazu fordern Sie mit markerImageWithColor:
eine getönte Version des Standardsymbols an und übergeben das resultierende Bild an die Symboleigenschaft von GMSMarker
.
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
.
icon
-Eigenschaft der Markierung verwenden
Mit dem 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 beim Anzeigen vieler Markierungen verbessert.
Das Bild kann mehrere Frames haben. Außerdem wird die Eigenschaft alignmentRectInsets
berücksichtigt, die nützlich ist, wenn eine Markierung einen Schatten oder einen anderen unbrauchbaren Bereich hat.
iconView
-Eigenschaft der Markierung verwenden
Mit dem folgenden Snippet wird eine Markierung mit einem benutzerdefinierten Symbol erstellt. Dazu wird die Eigenschaft iconView
der Markierung festgelegt und eine Farbänderung 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
UIView
akzeptiert, können Sie Ihre Markierungen durch eine Hierarchie von Standard-UI-Steuerelementen definieren, wobei jede Ansicht über die standardmäßigen Animationsfunktionen verfügt. Sie können Änderungen an Größe, Farbe und Alpha-Ebenen von Markierungen vornehmen und beliebige Transformationen anwenden. Das Attribut iconView
unterstützt die Animation aller animierbaren Eigenschaften von UIView
mit Ausnahme von frame
und center
.
Bei der Verwendung von iconView
sollten Sie Folgendes beachten:
UIView
kann Ressourcen stark beanspruchen, wenntracksViewChanges
aufYES
gesetzt ist. Dies kann zu einer erhöhten Akkunutzung führen. Im Vergleich dazu ist ein einzelner FrameUIImage
statisch und muss nicht noch einmal gerendert werden.- Auf einigen Geräten kann die Karte nicht richtig gerendert werden, wenn viele Markierungen auf dem Bildschirm zu sehen sind und jede Markierung eine eigene
UIView
hat und alle Markierungen gleichzeitig Änderungen erfassen. - Ein
iconView
reagiert nicht auf Nutzerinteraktionen, da er eine Momentaufnahme der Ansicht ist. - Die Ansicht verhält sich unabhängig von ihrem 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 werden überwacht und angewendet. Kurz gesagt: Unteransichten müssen in der Ansicht enthalten sein.
Für die Entscheidung, wann die Eigenschaft tracksViewChanges
festgelegt werden soll, sollten Sie die Leistung gegen die Vorteile durch das automatische Neuzeichnen der Markierung abwägen. Beispiel:
- Wenn Sie eine Reihe von Änderungen vornehmen müssen, können Sie das Attribut in
YES
und dann wieder inNO
ändern. - Wenn eine Animation ausgeführt wird oder die Inhalte asynchron geladen werden, sollte das Attribut auf
YES
gesetzt bleiben, bis die Aktionen abgeschlossen sind.
Deckkraft einer Markierung ändern
Sie können die Deckkraft einer Markierung über ihre opacity
-Eigenschaft steuern. Sie sollten die Deckkraft als Gleitkommazahl zwischen 0,0 und 1,0 angeben, wobei 0 vollständige Transparenz und 1 vollständige Deckkraft bedeutet.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Sie können die Deckkraft der Markierung mithilfe von GMSMarkerLayer
mit [Core Animation]Core Animation animieren.
Markierungen vereinfachen
Markierungssymbole werden normalerweise am Bildschirm des Geräts und nicht an der Oberfläche der Karte ausgerichtet. Daher wirkt sich das Drehen, Neigen oder Zoomen der Karte nicht unbedingt auf die Ausrichtung der Markierung aus.
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 gedreht wird. Wie normale Markierungen behalten auch flache Markierungen ihre Größe bei, wenn die Karte vergrößert oder verkleinert wird.
Wenn Sie die Ausrichtung der Markierung ändern möchten, setzen Sie ihre flat
-Eigenschaft 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
Sie können eine Markierung um ihren Ankerpunkt drehen, indem Sie die Eigenschaft rotation
festlegen. Geben Sie die Drehung als CLLocationDegrees
-Typ 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 Grad gedreht. Wenn die Eigenschaft groundAnchor
auf 0.5,0.5
festgelegt 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 für Markierungen verarbeiten
Sie können auf Ereignisse auf der Karte warten, 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 Touch-Gesten finden Sie Informationen zum Umgang mit bestimmten Markierungsereignissen. Im Leitfaden zu Ereignissen finden Sie auch eine Liste der Methoden in GMSMapViewDelegate. Informationen zu Street View-Ereignissen findest du unter GMSPanoramaViewDelegate
.