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.
Em resposta a um evento de clique em um marcador, você pode abrir uma janela de informações. Uma janela de informações mostra textos ou imagens em uma janela pop-up acima do marcador. É possível usar uma janela de informações padrão para exibir texto ou criar sua própria janela de informações personalizada para controlar totalmente o conteúdo.
Adicionar um marcador
Para adicionar um marcador, crie um objeto GMSMarker
que inclua um position
e title
e defina o respectivo map
.
O exemplo a seguir mostra como adicionar um marcador a um objeto GMSMapView
. O marcador é criado nas coordenadas 10,10
e exibe a string "Hello world" em uma janela de informações quando clicado.
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 com que o marcador apareça nogroundAnchor
quando adicionadokGMSMarkerAnimationFadeIn
para fazer com que o marcador apareça gradualmente quando adicionado.
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];
Para fazer modificações em um marcador depois de adicioná-lo ao mapa, mantenha o objeto GMSMarker
. É possível modificar o marcador depois 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 mudar 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 de GMSMarker
.
Swift
marker.icon = GMSMarker.markerImage(with: .black)
Objective-C
marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
Como personalizar a imagem do marcador
Para alterar a imagem do marcador padrão, defina um ícone personalizado usando as propriedades icon
ou iconView
dele.
Se iconView
estiver definido, a API vai ignorar a propriedade icon
. As atualizações do
icon
atual não são reconhecidas desde que o iconView
esteja definido.
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 pressupõe que o 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 de 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.
Usando a propriedade "iconView" do marcador
O snippet a seguir cria um marcador com um ícone personalizado definindo a propriedade iconView
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
, é possível ter uma hierarquia de controles de IU padrão definindo seus marcadores. Cada visualização tem 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, além de aplicar transformações arbitrárias. A propriedade iconView
é compatível com animação de todas as propriedades animaáveis de UIView
, exceto frame
e
center
.
Ao usar iconView
, observe as seguintes considerações:
- O
UIView
pode exigir recursos quandotracksViewChanges
está 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 se cada um tiver o próprio
UIView
, e todos os marcadores 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. É possível aplicar transformações que funcionam fora dos limites, mas o objeto desenhado precisa estar dentro dos limites do objeto. Todas as transformações/alterações são monitoradas e aplicadas. Em resumo: as subvisualizações precisam estar contidas dentro da visualização.
Para decidir quando definir a propriedade tracksViewChanges
, você precisa considerar o desempenho em relação às vantagens de ter o marcador redesenhado automaticamente. Exemplo:
- Se você tiver uma série de mudanças a serem feitas, poderá mudar 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,
é necessário 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 a propriedade opacity
. Especifique a opacidade como um ponto 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;
É possível animar a opacidade do marcador com a Animação principal por meio do GMSMarkerLayer
.
Nivelar um marcador
Normalmente, os ícones de marcadores são desenhados de acordo com a orientação da tela do dispositivo, e não da superfície do mapa. Portanto, girar, inclinar ou alterar o zoom do mapa não altera 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 mudam quando o mapa é girado e mudam de perspectiva quando ele é inclinado. Os marcadores planos não mudam de tamanho quando o mapa é ampliado ou reduzido.
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;
Girar um marcador
Você pode girar um marcador em torno do ponto de fixação dele, 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 próprio 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 processar eventos em marcadores
Você pode detectar eventos que ocorrem no mapa, como quando um usuário toca em um marcador. Para detectar eventos, implemente o protocolo GMSMapViewDelegate
. Consulte o
guia de eventos e a lista de métodos no
GMSMapViewDelegate
. Para eventos do Street View, consulte a GMSPanoramaViewDelegate
.