Um feed de dados passo a passo fornece informações de navegação apenas para dispositivos não projetados para orientação de navegação baseada em mapa. Ele fornece as próximas manobras com elementos que você fornece:
- ícones (esquerda, direita, retorno)
- números de voltas em rotatórias
- nomes de vias
- distâncias e tempo estimados até a próxima etapa do trajeto ou o destino final
É possível usar o feed passo a passo para criar experiências em que a IU completa do SDK de navegação não é adequada, como em telas pequenas. Por exemplo, você pode usar isso para passageiros de veículos de duas rodas, em que é possível projetar orientações de navegação para ajudar a chegar aos destinos mais rápido e com mais confiança, com o mínimo de distrações.
Elementos essenciais de exibição da navegação
Os campos principais de cada etapa de navegação são o nome completo da via, a manobra e a distância total da etapa, que estão disponíveis em GMSNavigationStepInfo
.
Para a viagem geral, é possível mostrar o tempo restante e a distância até a etapa atual ou até o destino, que estão disponíveis em GMSNavigationNavInfo
.
A imagem à direita mostra um exemplo desses elementos essenciais de navegação.
Configurar um listener de eventos
Para usar dados somente de navegação, é necessário implementar um listener de eventos para o
evento didChangeNavInfo
. No listener de eventos, acesse informações de viagem e
etapas para fornecer navegação passo a passo aos usuários.
Para implementar processadores de eventos, o controlador de visualização do mapa precisa implementar o protocolo
GMSNavigatorListener
. Para informações detalhadas sobre o processamento de eventos no SDK de navegação para iOS,
consulte Detectar eventos de navegação.
Processar o evento didChangeNavInfo
Crie um listener para o evento didChangeNavInfo
e adicione suporte a instruções passo a passo ao
app. No listener de eventos, use as seguintes classes e tipos enumerados para controlar
a navegação passo a passo:
GMSNavigationNavInfo
: classe que define informações sobre o estado da navegação.GMSNavigationStepInfo
: classe que define informações sobre uma única etapa em uma rota de navegação.GMSNavigationNavState
: enum que define o estado atual de uma navegação, como em rota, recalculando ou parada.GMSNavigationDrivingSide
: enumeração que define se esta etapa está em uma rota de direção à direita ou à esquerda.GMSNavigationManeuver
: enumeração que define a ação de navegação a ser realizada, como virar à esquerda ou à direita.
Confira abaixo exemplos de listeners de eventos para o evento didChangeNavInfo
:
Swift
// ViewController.swift class SomeViewController: UIViewController { ... mapView.navigator?.add(self); ... } extension SomeViewController: GMSNavigatorListener { func navigator(_ navigator: GMSNavigator, didUpdateNavInfo navInfo: GMSNavigationNavInfo) { // Get the current step information if navInfo.navState == .enroute { if let currentStep = navInfo.currentStep { ... roadNameLabel.text = currentStep.simpleRoadName ... } } } }
Objective-C
// ViewController.h @interface SomeViewController () <GMSNavigatorListener> @end // ViewController.m @implementation SomeViewController // Some initialization code. ... { ... [_mapView.navigator addListener:self]; ... } #pragma mark GMSNavigatorListener - (void)navigator:(GMSNavigator *)navigator didUpdateNavInfo:(GMSNavigationNavInfo *)navInfo { // Get the current step information if (navInfo.navState == GMSNavigationNavStateEnroute) { GMSNavigationStepInfo *currentStep = navInfo.currentStep; if (currentStep) { ... roadNameLabel.text = currentStep.simpleRoadName; ... } } ... }
Estados de navegação
Use a propriedade navState
de GMSNavigationNavInfo
para receber o estado atual da navegação, que é um dos seguintes:
Enroute: o estado
GMSNavigationNavStateEnroute
significa que a navegação guiada está ativa e o usuário está na rota fornecida. Informações sobre a próxima etapa da manobra atual estão disponíveis.Recalculando a rota:
GMSNavigationNavStateRerouting
significa que a navegação está em andamento, mas o navegador está procurando uma nova rota. A próxima etapa de manobra não está disponível porque ainda não há uma nova rota.Interrompida:
GMSNavigationNavStateStopped
significa que a navegação foi encerrada. Por exemplo, a navegação é interrompida quando o usuário sai dela no app. No app de exemplo, um estadoGMSNavigationNavStateStopped
limpa a tela de informações de navegação para impedir que as instruções de etapa sejam mostradas.
Indicação de faixa
O SDK de navegação representa as faixas no card de direção como
objetos de dados GMSNavigationLane
e GMSNavigationLaneDirection
. Um
objeto GMSNavigationLane
representa uma faixa específica durante a navegação e tem
uma lista de objetos GMSNavigationLaneDirection
que descrevem todas as curvas que
podem ser feitas nessa faixa.
A direção recomendada que um motorista deve seguir em uma faixa é marcada usando o campo recommended
.
Exemplo de orientação de faixa
O snippet a seguir ilustra a representação de dados das faixas exibidas na captura de tela anterior.
// Lane 1
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]
// Lane 2
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeNormalLeft, /*recommended=*/ true}]
// Lane 3
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false}]
// Lane 4
GMSNavigationLaneDirections =
[{/*GMSNavigationLaneShape=*/
GMSNavigationLaneShapeStraight, /*recommended=*/ false},
{/*GMSNavigationLaneShape=*/ GMSNavigationLaneShapeNormalRight, /*recommended=*/ false}]
Imagens de orientação de faixa
O SDK de navegação oferece suporte à geração de imagens de faixa para cada etapa de navegação,
conforme transmitido por GMSNavigationStepInfo
. Esses ícones se encaixam nas orientações de dimensionamento
de imagem do CarPlay.
Swift
let currentStepInfo = navInfo.currentStep let options = GMSNavigationStepImageOptions() options.maneuverImageSize = .square96 options.screenMetrics = UIScreen.mainScreen let maneuverImage = currentStepinfo.maneuverImage(options: options)
Objective-C
GMSNavigationStepInfo *stepInfo = navInfo.currentStep; GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init]; options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96; options.screenMetrics = UIScreen.mainScreen; UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];
Como criar ícones para manobras
O tipo enumerado GMSNavigationManeuver
define cada manobra possível que pode ocorrer durante a navegação. Você
pode receber a manobra para uma determinada etapa da propriedade maneuver
de
GMSNavigationStepInfo
.
Você precisa criar ícones de manobra e parear com as manobras associadas.
Para algumas manobras, é possível configurar um mapeamento um para um com um ícone, como
GMSNavigationManeuverDestinationLeft
e
GMSNavigationManeuverDestinationRight
. No entanto, como algumas manobras compartilham características com outras, talvez você queira mapear mais de uma manobra para um único ícone. Por exemplo, GMSNavigationManeuverTurnLeft
e
GMSNavigationManeuverOnRampLeft
podem ser mapeados para o ícone de virada à esquerda.
Algumas manobras contêm um rótulo adicional "No sentido horário" ou "No sentido anti-horário", que o SDK determina com base no lado de direção de um país. Por exemplo, em países onde a direção é feita do lado esquerdo da estrada, os motoristas fazem uma rotatória ou uma curva em U no sentido horário, enquanto os países com direção do lado direito vão no sentido anti-horário. O SDK de navegação detecta se uma manobra ocorre no tráfego da esquerda ou da direita e gera a manobra adequada. Portanto, o ícone da manobra pode ser diferente para uma manobra no sentido horário ou anti-horário.
Abra para conferir exemplos de ícones de diferentes manobras
Ícone de exemplo | Movimentações passo a passo |
---|---|
DEPART UNKNOWN |
|
STRAIGHT ON_RAMP_UNSPECIFIED OFF_RAMP_UNSPECIFIED NAME_CHANGE
|
|
TURN_RIGHT ON_RAMP_RIGHT
|
|
TURN_LEFT ON_RAMP_LEFT
|
|
TURN_SLIGHT_RIGHT ON_RAMP_SLIGHT_RIGHT OFF_RAMP_SLIGHT_RIGHT
|
|
TURN_SLIGHT_LEFT ON_RAMP_SLIGHT_LEFT OFF_RAMP_SLIGHT_LEFT
|
|
TURN_SHARP_RIGHT ON_RAMP_SHARP_RIGHT OFF_RAMP_SHARP_RIGHT
|
|
TURN_SHARP_LEFT ON_RAMP_SHARP_LEFT OFF_RAMP_SHARP_LEFT
|
|
TURN_U_TURN_COUNTERCLOCKWISE ON_RAMP_U_TURN_COUNTERCLOCKWISE OFF_RAMP_U_TURN_COUNTERCLOCKWISE
|
|
TURN_U_TURN_CLOCKWISE ON_RAMP_U_TURN_CLOCKWISE OFF_RAMP_U_TURN_CLOCKWISE
|
|
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
|
|
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_RIGHT_CLOCKWISE
|
|
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
|
|
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_STRAIGHT_CLOCKWISE
|
|
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
|
|
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_LEFT_CLOCKWISE
|
|
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
|
|
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
|
|
ROUNDABOUT_U_TURN_CLOCKWISE
|
|
ROUNDABOUT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_CLOCKWISE
|
|
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
|
|
ROUNDABOUT_EXIT_CLOCKWISE
|
|
MERGE_RIGHT OFF_RAMP_RIGHT
|
|
MERGE_LEFT OFF_RAMP_LEFT
|
|
FORK_RIGHT TURN_KEEP_RIGHT ON_RAMP_KEEP_RIGHT OFF_RAMP_KEEP_RIGHT
|
|
FORK_LEFT TURN_KEEP_LEFT ON_RAMP_KEEP_LEFT OFF_RAMP_KEEP_LEFT
|
|
MERGE_UNSPECIFIED
|
|
DESTINATION
|
|
DESTINATION_RIGHT
|
|
DESTINATION_LEFT
|
|
FERRY_BOAT
|
|
FERRY_TRAIN
|
Usar ícones gerados
O SDK de navegação oferece suporte à geração de ícones de manobra para um determinado
GMSNavigationStepInfo
. Esses ícones se encaixam nas orientações de dimensionamento de
imagens do CarPlay.
Swift
let currentStepInfo = navInfo.currentStep let options = GMSNavigationStepImageOptions() options.maneuverImageSize = .square96 options.screenMetrics = UIScreen.mainScreen let maneuverImage = currentStepinfo.maneuverImage(options: options)
Objective-C
GMSNavigationStepInfo *stepInfo = navInfo.currentStep; GMSNavigationStepImageOptions *options = [[GMSNavigationStepImageOptions alloc] init]; options.maneuverImageSize = GMSNavigationManeuverImageSizeSquare96; options.screenMetrics = UIScreen.mainScreen; UIImage* maneuverImage = [stepInfo maneuverImageWithOptions:options];