Los marcadores indican ubicaciones únicas en el mapa.
De forma predeterminada, los marcadores usan un ícono estándar que tiene el aspecto común de Google Maps y sentir. Si quieres personalizar tu marcador, puedes cambiar el color del marcador predeterminado, reemplazar la imagen del marcador por un icono personalizado o cambiar otras propiedades del marcador.
En respuesta a un evento de clic en un marcador, puedes abrir una información en la ventana modal. Las ventanas de información muestran texto o imágenes en una ventana de diálogo. arriba del marcador. Puedes usar una ventana de información predeterminada para mostrar texto o crear tu propia ventana de información personalizada para controlar por completo el contenido.
Cómo agregar un marcador
Para agregar un marcador, crea un objeto GMSMarker
que incluya un position
y
title
y establece su map
.
En el siguiente ejemplo, se muestra cómo agregar un marcador a un marcador
GMSMapView
. El marcador se crea en las coordenadas 10,10
y muestra
como la cadena “Hello World” en una ventana de información al hacer clic.
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;
Puedes animar la adición de nuevos marcadores al mapa estableciendo el
marker.appearAnimation
a:
kGMSMarkerAnimationPop
para hacer que el marcador se destaque desde sugroundAnchor
. cuando se agregan.kGMSMarkerAnimationFadeIn
para que el marcador se muestre gradualmente cuando se agregue.
Cómo quitar un marcador
Para quitar un marcador del mapa, configura la propiedad map
del objeto
GMSMarker
a nil
. También puedes quitar todas las superposiciones
(incluidos los marcadores) que se encuentran actualmente en el mapa. Para ello, llama a GMSMapView
clear
.
.
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];
Si deseas modificar un marcador después de agregarlo al mapa, sigue estos pasos:
asegúrate de conservar el objeto GMSMarker
. Puedes modificar el marcador
realizar cambios en este objeto más adelante.
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;
Cómo cambiar el color del marcador
Puedes personalizar el color de la imagen predeterminada del marcador solicitando un tono
del ícono predeterminado con markerImageWithColor:
y pasar el
imagen resultante a la propiedad del ícono de GMSMarker
.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Cómo personalizar la imagen del marcador
Si deseas cambiar la imagen predeterminada del marcador, puedes configurar un icono personalizado con
la propiedad icon
o iconView
del marcador Si se establece iconView
, la API
Ignora la propiedad icon
.
Mediante la propiedad icon
del marcador
Con el siguiente fragmento, se crea un marcador con un ícono personalizado proporcionado como
UIImage
en la propiedad icon
El ícono está centrado en Londres, Inglaterra. El
supone que tu aplicación contiene una imagen llamada “house.png”.
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;
Si creas varios marcadores con la misma imagen, utiliza la misma instancia.
de UIImage
para cada uno de los marcadores. Esto ayuda a mejorar el rendimiento de tu aplicación cuando se muestran muchos marcadores.
Esta imagen puede tener varios fotogramas. Además, el archivo alignmentRectInsets
propiedad se respeta, lo cual es útil si un marcador tiene una sombra u otra
una región inutilizable.
Mediante la propiedad iconView
del marcador
En el siguiente fragmento, se crea un marcador con un icono personalizado estableciendo la
la propiedad iconView
del marcador y anima un cambio en el color del marcador.
En el fragmento, se supone que tu aplicación contiene una imagen llamada “house.png”.
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
Debido a que iconView
acepta un UIView
, puedes tener una jerarquía de IU estándar
controles que definen tus marcadores; cada vista tendrá el conjunto estándar de animación
capacidades de integración. Puedes incluir cambios en el tamaño, el color y los alfabetos del marcador
y aplicar transformaciones arbitrarias. La propiedad iconView
admite la animación de todas las propiedades de UIView
que pueden animarse, excepto frame
y
center
Ten en cuenta las siguientes consideraciones cuando uses iconView
:
UIView
puede demandar recursos cuando se configuratracksViewChanges
. aYES
, lo que podría aumentar el uso de la batería. En comparación, un ElUIImage
de un solo fotograma es estático y no necesita volver a renderizarse.- Es posible que algunos dispositivos tengan dificultades para renderizar el mapa si tienes muchos marcadores activados
pantalla y cada marcador tiene su propio
UIView
; todos los marcadores realizan un seguimiento cambios al mismo tiempo. - Un
iconView
no responde a la interacción del usuario, ya que es una instantánea de la vista. - La vista se comporta como si
clipsToBounds
se hubiera establecido enYES
, independientemente de su el valor real. Puedes aplicar transformaciones que funcionen fuera de los límites, pero objeto que dibujes debe estar dentro de los límites del objeto. Todas se supervisan y aplican las transformaciones y los cambios. En resumen, las subvistas deben ser contenidos en la vista.
Para decidir cuándo establecer la propiedad tracksViewChanges
, debes ponderar
consideraciones de rendimiento en relación con las ventajas de que el marcador se vuelva a dibujar
automáticamente. Por ejemplo:
- Si necesitas realizar una serie de modificaciones, puedes cambiar la propiedad a
YES
y, luego, volver aNO
. - Cuando se ejecute una animación o se cargue el contenido de forma asincrónica, debes mantener la propiedad establecida en
YES
hasta que se completen las acciones.
Cómo cambiar la opacidad del marcador
Puedes controlar la opacidad de un marcador con su propiedad opacity
. Deberías
especificar la opacidad como un número de punto flotante entre 0.0 y 1.0, donde 0 es completamente transparente
y 1 es completamente opaco.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Puedes animar la opacidad del marcador con [Core Animation]Core
Animación con GMSMarkerLayer
.
Cómo compactar un marcador
Los iconos de marcadores normalmente se dibujan orientados respecto de la pantalla del dispositivo en lugar de la superficie del mapa, por lo que rotar, inclinar o acercar el mapa no necesariamente cambiar la orientación del marcador
Puedes configurar la orientación de un marcador de modo que se vea plano respecto de la Tierra. Fijo los marcadores rotan cuando se rota el mapa y cambian de perspectiva cuando se rota el mapa inclinado. Al igual que los marcadores normales, los marcadores planos conservan su tamaño cuando el mapa se acercarte o alejarte.
Para cambiar la orientación del marcador, configura la propiedad flat
del marcador en
YES
o 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;
Cómo rotar un marcador
Para rotar un marcador alrededor de su punto de anclaje, configura rotation
.
propiedad. Especifica la rotación como un tipo CLLocationDegrees
, medida en
grados en el sentido de las manecillas del reloj desde la posición predeterminada. Cuando el marcador está plano en el mapa,
la posición predeterminada es el norte.
En el siguiente ejemplo, el marcador rota 90°. Configura el groundAnchor
en 0.5,0.5
, el marcador rota sobre su centro, en lugar
de su base.
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;
Cómo controlar eventos en los marcadores
Puedes escuchar eventos que ocurren en el mapa, como cuando un usuario presiona un
marcador. Para escuchar eventos, debes implementar el
Protocolo GMSMapViewDelegate
. Consulta los eventos de marcador
los gestos para aprender a manejar
eventos de marcadores específicos. La guía de eventos también proporciona una lista de
en GMSMapViewDelegate. Para obtener información sobre eventos de Street View, consulta GMSPanoramaViewDelegate
.