Os marcadores indicam locais únicos no mapa.
Por padrão, os marcadores usam um ícone padrão que tem a aparência comum do Google Maps. Se você quiser personalizar seu marcador, altere a cor dele, substitua a imagem dele por um ícone personalizado ou altere outras propriedades do marcador.
Em resposta a um evento de clique em um marcador, você pode abrir uma janela de informações. Uma janela de informações exibe textos ou imagens em uma janela pop-up acima do marcador. Você pode usar uma janela de informações padrão para exibir texto ou criar sua própria janela de informações personalizada para controlar completamente o conteúdo.
Adicionar um marcador
Para adicionar um marcador, crie um objeto GMSMarker
que inclua position
e title
e defina map
.
O exemplo a seguir demonstra como adicionar um marcador a um objeto GMSMapView
existente. O marcador é criado nas coordenadas 10,10
e, quando clicado, exibe a string "Hello world" em uma janela de informações.
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;
Você pode animar a adição de novos marcadores ao mapa definindo a propriedade marker.appearAnimation
como:
kGMSMarkerAnimationPop
para fazer o marcador aparecer a partir dogroundAnchor
quando adicionadokGMSMarkerAnimationFadeIn
para fazer o marcador aparecer gradualmente.
Como remover um marcador
Você pode remover um marcador do mapa definindo a propriedade map
do GMSMarker
como nil
. Se preferir, remova todas as sobreposições (incluindo marcadores) no mapa chamando o método 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];
Se você quiser fazer modificações em um marcador depois de adicioná-lo ao mapa, mantenha o objeto GMSMarker
. Você pode modificar o marcador mais tarde, fazendo alterações nesse objeto.
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;
Como alterar a cor do marcador
Você pode personalizar a cor da imagem do marcador padrão solicitando uma versão colorida do ícone padrão com markerImageWithColor:
e transmitindo a imagem resultante para a propriedade do ícone GMSMarker
.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Como personalizar a imagem do marcador
Se você quiser alterar a imagem do marcador padrão, defina um ícone personalizado usando a propriedade icon
ou iconView
do marcador.
Se iconView
for definido, a API ignorará a propriedade icon
. As atualizações do
icon
atual não são reconhecidas, desde que o iconView
esteja definido.
Como usar a propriedade "icon" do marcador
O snippet a seguir cria um marcador com um ícone personalizado como UIImage
na propriedade icon
. O ícone está centralizado em Londres, Inglaterra. O snippet presume que seu aplicativo contém uma imagem chamada "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;
Se você estiver criando vários marcadores com a mesma imagem, use a mesma instância do UIImage
para cada um deles. Isso ajuda a melhorar o desempenho do aplicativo ao exibir muitos marcadores.
Essa imagem pode ter vários quadros. Além disso, a propriedade alignmentRectInsets
é respeitada, o que é útil se um marcador tiver uma sombra ou outra região inutilizável.
Como usar a propriedade "iconView" do marcador
O snippet a seguir cria um marcador com um ícone personalizado definindo a propriedade iconView
do marcador e anima uma alteração na cor do marcador.
O snippet assume que seu aplicativo contém uma imagem com o nome "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
Como iconView
aceita um UIView
, você pode ter uma hierarquia de controles de IU padrão definindo seus marcadores, cada visualização com o conjunto padrão de recursos de animação. Você pode incluir alterações no tamanho, na cor e nos níveis alfa do marcador, bem como aplicar transformações arbitrárias. A propriedade iconView
é compatível com animações de todas as propriedades animáveis de UIView
, exceto frame
e
center
.
Observe as seguintes considerações ao usar iconView
:
- O
UIView
pode exigir recursos quandotracksViewChanges
estiver definido comoYES
, o que pode resultar no aumento do uso da bateria. Em comparação, um único frameUIImage
é estático e não precisa ser renderizado novamente. - Alguns dispositivos podem ter dificuldade para renderizar o mapa se você tiver muitos marcadores na tela, e cada um tiver o próprio
UIView
, e todos eles estiverem rastreando mudanças ao mesmo tempo. - Um
iconView
não responde à interação do usuário, porque é um snapshot da visualização. - A visualização se comporta como se
clipsToBounds
estivesse definida comoYES
, independentemente do valor real. Você pode aplicar transformações que funcionam fora dos limites, mas o objeto que você desenhar precisa estar dentro dos limites do objeto. Todas as transformações/alterações são monitoradas e aplicadas. Resumindo: as subvisualizações precisam estar contidas na visualização.
Para decidir quando definir a propriedade tracksViewChanges
, avalie as considerações de desempenho em relação às vantagens de ter o marcador redesenhado automaticamente. Por exemplo:
- Se você tiver uma série de mudanças a serem feitas, altere a propriedade para
YES
e depois paraNO
. - Quando uma animação está em execução ou o conteúdo está sendo carregado de forma assíncrona,
você precisa manter a propriedade definida como
YES
até que as ações sejam concluídas.
Como alterar a opacidade do marcador
Você pode controlar a opacidade de um marcador com sua propriedade opacity
. Especifique a opacidade como um número flutuante entre 0,0 e 1,0, em que 0 é totalmente transparente e 1 é totalmente opaco.
Swift
marker.opacity = 0.6
Objective-C
marker.opacity = 0.6;
Você pode animar a opacidade do marcador com o Core Animation usando GMSMarkerLayer
.
Como nivelar um marcador
Normalmente, os ícones de marcador são desenhados de acordo com a orientação da tela do dispositivo, e não da superfície do mapa. Portanto, a rotação, a inclinação ou o zoom do mapa não alteram necessariamente a orientação do marcador.
Você pode definir a orientação de um marcador como plana em relação ao solo. Os marcadores planos giram quando o mapa gira e alteram a perspectiva quando ele é inclinado. Assim como os marcadores regulares, os marcadores planos retêm o tamanho quando o zoom do mapa é aumentado ou diminuído.
Para alterar a orientação do marcador, defina a propriedade flat
como YES
ou 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;
Como girar um marcador
Você pode girar um marcador em torno de seu ponto de fixação, definindo a propriedade rotation
. Especifique a rotação como um tipo CLLocationDegrees
, medido em
graus no sentido horário a partir da posição padrão. Quando o marcador é plano no mapa, a posição padrão é norte.
O exemplo a seguir gira o marcador em 90°. Definir a propriedade groundAnchor
como 0.5,0.5
faz com que o marcador seja girado em torno do centro, em vez da 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;
Como gerenciar eventos em marcadores
Você pode ouvir eventos que ocorrem no mapa, como quando um usuário toca em um marcador. Para detectar eventos, você precisa implementar o protocolo GMSMapViewDelegate
. Consulte o
guia para eventos e a lista de métodos na
GMSMapViewDelegate
. Para eventos do Street View, consulte a GMSPanoramaViewDelegate
.