Navigations-UI ändern

Mit dem Navigation SDK for iOS können Sie die Nutzererfahrung mit Ihrer Karte anpassen, indem Sie festlegen, welche der integrierten UI-Steuerelemente und ‑Elemente auf der Karte angezeigt werden und welche Touch-Gesten zulässig sind. Sie können auch die Darstellung der Navigations-Benutzeroberfläche ändern. Richtlinien zu zulässigen Änderungen an der Navigations-UI finden Sie auf der Seite „Richtlinien“.

UI-Steuerelemente für die Karte

Das Navigation SDK bietet einige integrierte UI-Steuerelemente, die denen in der Google Maps App für iOS ähneln. Die Sichtbarkeit dieser Steuerelemente lässt sich mit der Klasse GMSUISettings aktivieren und deaktivieren. Änderungen, die Sie an dieser Klasse vornehmen, werden sofort in der Karte angezeigt.

Kompass

Das Navigation SDK bietet eine Kompassgrafik, die unter bestimmten Umständen oben rechts auf der Karte erscheint und nur dann, wenn sie aktiviert ist. Wenn der Nutzer auf den Kompass klickt, wird die Kamera an eine Position mit Nullrichtung (Standardorientierung) zurückbewegt. Anschließend wird der Kompass ausgeblendet.

Wenn die Navigation aktiviert und der Kameramodus auf „Folgen“ eingestellt ist, bleibt der Kompass sichtbar. Durch Tippen auf den Kompass wird zwischen der geneigten und der Übersichtsperspektive der Kamera gewechselt.

Um Ablenkungsgrad des Fahrers zu vermeiden, bleibt der Kompass an derselben Position, wenn der Header (im Porträtmodus) erweitert wird und mit der Standardposition des Kompasses in Konflikt gerät. Wenn Sie ein sekundäres benutzerdefiniertes Steuerelement für die Kopfzeile oder eine Ansicht für Kopfzeilenzubehör hinzufügen, wird der Kompass ausgeblendet, um Konflikte mit der Benutzeroberfläche zu vermeiden.

Der Kompass unterstützt den Tag- und den Nachtmodus sowie den dunklen Modus.

Der Kompass ist ab Version 11.0.0 standardmäßig aktiviert. Sie können den Kompass deaktivieren, indem Sie das Attribut compassButton von GMSUISettings auf false setzen.

Swift

mapView.settings.compassButton = false

Objective-C

mapView.settings.compassButton = NO;

Button „Mein Standort“

Der Button „Mein Standort“ wird nur dann unten rechts auf dem Bildschirm angezeigt, wenn er aktiviert ist. Wenn ein Nutzer auf den Button klickt, wird die Kamera animiert, um den aktuellen Standort des Nutzers in den Fokus zu rücken, sofern dieser bekannt ist. Sie können den Button aktivieren, indem Sie die Eigenschaft myLocationButton von GMSUISettings auf true setzen.

Swift

mapView.settings.myLocationButton = true

Objective-C

mapView.settings.myLocationButton = YES;

Schaltfläche „Neu zentrieren“

Wenn die Navigation aktiviert ist, wird die Schaltfläche „Neu zentrieren“ angezeigt, wenn der Nutzer in der Kartenansicht scrollt. Sie wird ausgeblendet, wenn der Nutzer auf die Schaltfläche tippt, um die Karte neu zu zentrieren. Damit die Schaltfläche zum Neuzentrieren angezeigt wird, legen Sie das Attribut recenterButtonEnabled von GMSUISettings auf true fest. Wenn Sie verhindern möchten, dass die Schaltfläche zum Zentrieren angezeigt wird, setzen Sie recenterButtonEnabled auf false.

Swift

mapView.settings.isRecenterButtonEnabled = true

Objective-C

mapView.settings.recenterButtonEnabled = YES;

Zubehör für die Karten-Benutzeroberfläche

Das Navigation SDK bietet UI-Zubehör, das während der Navigation angezeigt wird, ähnlich wie in der Google Maps App für iOS. Sie können die Sichtbarkeit oder das Erscheinungsbild dieser Steuerelemente wie in diesem Abschnitt beschrieben anpassen. Änderungen, die Sie hier vornehmen, werden bei der nächsten Fahrt des Nutzers berücksichtigt.

Während der Navigation wird der Navigationsheader oben auf dem Display und der Navigations-Footer unten angezeigt. In der Navigationsüberschrift werden der Straßenname und die Richtung für die nächste Abbiegung auf der Route sowie die Richtung der darauffolgenden Abbiegung angezeigt. In der Fußzeile der Navigation werden die voraussichtliche Zeit und Entfernung zum Ziel sowie die voraussichtliche Ankunftszeit angezeigt.

Sie können die Sichtbarkeit der Navigationskopf- und -fußzeile ein- und ausschalten und ihre Farben programmatisch mit den folgenden Attributen festlegen:

Im folgenden Codebeispiel wird gezeigt, wie die Sichtbarkeit für Kopf- und Fußzeile aktiviert und dann navigationHeaderPrimaryBackgroundColor auf Blau und navigationHeaderSecondaryBackgroundColor auf Rot festgelegt wird.

Swift

mapView.settings.isNavigationHeaderEnabled = true
mapView.settings.isNavigationFooterEnabled = true
mapView.settings.navigationHeaderPrimaryBackgroundColor = .blue
mapView.settings.navigationHeaderSecondaryBackgroundColor = .red

Objective-C

mapView.settings.navigationHeaderEnabled = YES;
mapView.settings.navigationFooterEnabled = YES;
mapView.settings.navigationHeaderPrimaryBackgroundColor = [UIColor blueColor];
mapView.settings.navigationHeaderSecondaryBackgroundColor = [UIColor redColor];

Sie können Ihre App anpassen, indem Sie die Ansicht des sekundären Navigationsheaders durch eine eigene benutzerdefinierte Zubehöransicht ersetzen. Dazu erstellen Sie eine Ansicht, die das GMSNavigationAccessoryView-Protokoll implementiert. Dieses Protokoll hat eine erforderliche Methode: -heightForAccessoryViewConstrainedToSize:onMapView:. Sie erhalten die maximal verfügbare Größe für Ihre Ansicht in der angegebenen Karte und müssen die Höhe angeben, die für Ihre Ansicht erforderlich ist.

Anschließend können Sie diese Ansicht an die mapView übergeben, indem Sie setHeaderAccessoryView: aufrufen. Die mapView blendet alle aktuellen Ansichten aus und blendet dann Ihre benutzerdefinierte Ansicht ein. Der Navigationsheader muss sichtbar sein, damit Ihre benutzerdefinierte Ansicht angezeigt werden kann.

Wenn Sie die benutzerdefinierte Ansicht für die Kopfzeile entfernen möchten, übergeben Sie nil an setHeaderAccessoryView:.

Wenn sich die Größe der Ansicht ändern muss, können Sie invalidateLayoutForAccessoryView: aufrufen und die Ansicht übergeben, deren Größe geändert werden muss.

Beispiel

Das folgende Codebeispiel zeigt eine benutzerdefinierte Ansicht, die das GMSNavigationAccessoryView-Protokoll implementiert. Diese benutzerdefinierte Ansicht wird dann verwendet, um eine benutzerdefinierte Zubehöransicht für den Navigationsheader festzulegen.

Swift

class MyCustomView: UIView, GMSNavigationAccessoryView {
…
  func heightForAccessoryViewConstrained(to size: CGSize, on mapView: GMSMapView) -> CGFloat {
    // viewHeight gets calculated as the height your view needs.
    return viewHeight
  }
…
}

let customView = MyCustomView(...)
mapView.setHeaderAccessory(customView)

// At some later point customView changes size.
mapView.invalidateLayout(forAccessoryView: customView)

// Remove the custom header accessory view.
mapView.setHeaderAccessory(nil)

Objective-C

@interface MyCustomView : UIView <GMSNavigationAccessoryView>
…
@end

@implementation MyCustomView
…
- (CGFloat)heightForAccessoryViewConstrainedToSize:(CGSize)size onMapView:(GMSMapView *)mapView {
  // viewHeight gets calculated as the height your view needs.
  return viewHeight;
}
…
@end

MyCustomView *customView = [[MyCustomView alloc] init…];
[_mapView setHeaderAccessoryView:customView];

// At some later point customView changes size.
[_mapView invalidateLayoutForAccessoryView:customView];

// Remove the custom header accessory view.
[_mapView setHeaderAccessoryView:nil];

Kopfzeilenfarben im Modus für wenig Licht

Das Navigation SDK for iOS berechnet den vorgeschlagenen hellen Modus basierend auf der Tageszeit und dem aktuellen Standort des Geräts und ruft die Listener-Methode GMSNavigatorListener.didChangeSuggestedLightingMode auf, wenn sich der vorgeschlagene Modus ändert (z. B. bei Sonnenaufgang oder Sonnenuntergang). Sie haben folgende Möglichkeiten, das Verhalten des Low-Light-Modus programmatisch zu ändern:

Routenliste

Sie können in Ihrer App eine detaillierte Wegbeschreibung bereitstellen. Das folgende Beispiel zeigt eine mögliche Vorgehensweise. Diese Schritte können je nach Implementierung variieren.

  1. Aktivieren Sie eine Einstiegspunktschaltfläche, nachdem setDestinations auf dem GMSNavigator (Navigator) erfolgreich abgeschlossen wurde und guidanceActive auf dem Navigator aktiviert wurde.
  2. Wenn ein Nutzer auf die Schaltfläche für den Einstiegspunkt tippt, erstellen Sie einen GMSNavigationDirectionsListController (Controller) mit dem Navigator, der mit dem GMSMapView (mapView) verknüpft ist.
  3. Fügen Sie den Controller einer Instanz von UIViewController (Ansichtscontroller) hinzu und fügen Sie directionsListView als untergeordnete Ansicht des Ansichtscontrollers hinzu. Die Methoden reloadData und invalidateLayout des Controllers sollten wie bei einem UICollectionView aufgerufen werden.
  4. Stelle den Viewcontroller in die Viewcontroller-Hierarchie der App.

Im folgenden Codebeispiel wird gezeigt, wie Sie ein DirectionsListViewController hinzufügen.

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  // Add the directionsListView to the host view controller's view.
  let directionsListView = directionsListController.directionsListView
  directionsListView.frame = self.view.frame
  self.view.addSubview(directionsListView)
  directionsListView.translatesAutoresizingMaskIntoConstraints = false
  directionsListView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
  directionsListView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
  directionsListView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
  directionsListView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
  ...
}

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  // Make sure data is fresh when the view appears.
  directionsListController.reloadData()
  ...
}

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
  super.willTransition(to: newCollection, with: coordinator)
  // Invalidate the layout during rotation.
  coordinator.animate(alongsideTransition: {_ in
    self.directionsListController.invalidateLayout()
  })
  ...
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  // Add the directionsListView to the host view controller's view.
  UIView *directionsListView = _directionsListController.directionsListView;
  directionsListView.frame = self.view.bounds;
  [self.view addSubview:directionsListView];
  directionsListView.translatesAutoresizingMaskIntoConstraints = NO;
  [directionsListView.topAnchor constraintEqualToAnchor:self.view.topAnchor].active = YES;
  [directionsListView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor].active = YES;
  [directionsListView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor].active = YES;
  [directionsListView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor].active = YES;
  ...
}

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  // Make sure data is fresh when the view appears.
  [_directionsListController reloadData];
  ...
}

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection
              withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
  [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
  void(^animationBlock)(id <UIViewControllerTransitionCoordinatorContext>context) =
      ^void(id <UIViewControllerTransitionCoordinatorContext>context) {
    [_directionsListController invalidateLayout];
  };
  // Invalidate the layout during rotation.
  [coordinator animateAlongsideTransition:animationBlock
                               completion:nil];
  ...
}

...

Fortschrittsanzeige für die Fahrt

Der Navigationsansicht wurde eine Fortschrittsanzeige für die Fahrt hinzugefügt.

Die Fortschrittsanzeige für die Fahrt ist eine vertikale Leiste, die zu Beginn der Navigation auf der Start-/Vorderseite der Karte angezeigt wird. Wenn diese Option aktiviert ist, wird eine Übersicht über die gesamte Fahrt mit dem Ziel und der aktuellen Position des Nutzers angezeigt.

So können Nutzer schnell auf bevorstehende Probleme wie Traffic reagieren, ohne zoomen zu müssen. Bei Bedarf kann die Route dann neu berechnet werden. Wenn der Nutzer die Route ändert, wird die Fortschrittsanzeige zurückgesetzt, als ob ab diesem Punkt eine neue Fahrt begonnen hätte.

In der Fortschrittsanzeige für die Fahrt werden die folgenden Statusindikatoren angezeigt:

  • Verkehrsstatus: Der Status des anstehenden Verkehrs.

  • Aktueller Standort: Der aktuelle Standort des Fahrers während der Fahrt.

  • Zurückgelegte Route: Der bereits zurückgelegte Teil der Fahrt.

Aktivieren Sie die Fortschrittsanzeige für die Fahrt, indem Sie das Attribut navigationTripProgressBarEnabled in GMSUISettings festlegen.

Swift

mapView.settings.isNavigationTripProgressBarEnabled = true

Objective-C

mapView.settings.navigationTripProgressBarEnabled = YES;

Positionierung der Fortschrittsanzeige für Fahrten

  • Die linke Seite der Leiste ist ungefähr am linken Rand des Tachometers, des Google-Logos und der Schaltfläche „Neu zentrieren“ (falls sichtbar) ausgerichtet. Die Breite beträgt 12 pt.
  • Die Fortschrittsanzeige für die Fahrt reagiert dynamisch auf den vertikalen Platz auf dem Bildschirm. Der untere Rand des Balkens befindet sich 210 pt über dem unteren Rand des Bildschirms. Der obere Rand der Fortschrittsanzeige für die Fahrt muss mindestens 170 pt vom oberen Rand des Bildschirms entfernt sein. Die maximale Höhe der Leiste beträgt 400 pt.
  • Wenn sich die Fortschrittsanzeige für die Fahrt mit der Navigationskopfzeile oder anderen Navigationselementen der Benutzeroberfläche überschneidet, wird sie unter diesen anderen Elementen angezeigt.

Prompt Visibility API (experimentell)

Mit der Prompt Visibility API können Sie Konflikte zwischen UI-Elementen, die vom Navigation SDK generiert werden, und Ihren eigenen benutzerdefinierten UI-Elementen vermeiden. Dazu fügen Sie einen Listener hinzu, der einen Callback empfängt, bevor ein UI-Element des Navigation SDK angezeigt wird und sobald das Element entfernt wird. Weitere Informationen, einschließlich Codebeispielen, finden Sie im Abschnitt Prompt Visibility API auf der Seite Echtzeitunterbrechungen konfigurieren.

Tachometer

Wenn die Navigation aktiviert und der Reisemodus auf „Fahren“ festgelegt ist, wird im Navigation SDK für iOS in der unteren Ecke der Karte ein Steuerelement für die Geschwindigkeitsbegrenzung angezeigt, das die aktuelle Geschwindigkeitsbegrenzung angibt. Wenn der Fahrer das Tempolimit überschreitet, wird das Steuerelement maximiert und ein zweiter Tachometer mit der aktuellen Geschwindigkeit des Fahrers angezeigt.

Sie können Warnstufen festlegen, um die Formatierung der Tachoanzeige zu ändern, wenn der Fahrer das Tempolimit um einen bestimmten Betrag überschreitet. Sie können beispielsweise festlegen, dass die aktuelle Geschwindigkeit in roter Textfarbe angezeigt wird, wenn der Fahrer die Geschwindigkeitsbegrenzung um 5 mph überschreitet, und mit einem roten Hintergrund, wenn er die Geschwindigkeitsbegrenzung um 10 mph überschreitet.

Wenn Sie die Tempolimit-Steuerung anzeigen möchten, legen Sie die Eigenschaft shouldDisplaySpeedometer von GMSUISettings auf true fest. Wenn die Steuerung für das Tempolimit nicht angezeigt werden soll, setzen Sie shouldDisplaySpeedometer auf false.

Swift

mapView.settings.shouldDisplaySpeedometer = true

Objective-C

mapView.settings.shouldDisplaySpeedometer = YES;

Weitere Informationen zum Einrichten von Tachometer-Warnungen finden Sie unter Tachometer-Warnungen konfigurieren.

Zielmarkierungen

Sie können die Zielmarkierungen für eine bestimmte Route ein- oder ausblenden, indem Sie die Eigenschaft showsDestinationMarkers von GMSUISettings festlegen. Im folgenden Beispiel werden die Zielmarkierungen deaktiviert.

Swift

mapView.settings.showsDestinationMarkers = false

Objective-C

mapView.settings.showsDestinationMarkers = NO;

Funktionen für die Kartennutzung

Mit dem Navigation SDK können Sie die Navigation für Ihre Nutzer weiter anpassen. Änderungen, die Sie an Ihrer Instanz vornehmen, werden bei der nächsten Aktualisierung Ihrer App durch den Nutzer übernommen.

Hervorhebung des Ziels und Eingänge

Hervorhebung von Zielen und Eingängen

Wenn ein Ziel mit einem placeID erstellt wird, wird das Zielgebäude hervorgehoben und nach Möglichkeit ein Eingangssymbol angezeigt. Diese visuellen Hinweise helfen Nutzern, ihr Ziel zu erkennen und dorthin zu navigieren.

Wenn Sie ein Ziel mit einem placeID erstellen möchten, verwenden Sie einen der GMSNavigationWaypoint-Initialisierer, der ein placeID akzeptiert. Die im Tutorial „Route abfahren“ erstellten Ziele enthalten beispielsweise eine Zielhervorhebung und Eingangsbezeichnungen, sofern verfügbar.

3D-Gebäude werden während der Navigation angezeigt.

3D-Gebäude während der Navigation anzeigen

3D-Gebäude werden standardmäßig während der Navigation angezeigt. Um diese Funktion zu deaktivieren, setzen Sie buildingsEnabled auf false (Swift) oder NO (Objective-C).

Standardkartenbewegungen deaktivieren

Sie können die Standardgesten auf der Karte deaktivieren, indem Sie Eigenschaften der Klasse GMSUISettings festlegen, die als Eigenschaft von GMSMapView verfügbar ist. Die folgenden Gesten können programmgesteuert aktiviert bzw. deaktiviert werden. Das Deaktivieren der Geste schränkt den programmatischen Zugriff auf die Kameraeinstellungen nicht ein.

  • scrollGestures: Steuert, ob Scrollgesten aktiviert oder deaktiviert sind. Wenn diese Option aktiviert ist, können Nutzer die Kamera durch Wischen schwenken.
  • zoomGestures: Steuert, ob Zoomgesten aktiviert oder deaktiviert sind. Wenn diese Option aktiviert ist, können Nutzer doppeltippen, mit zwei Fingern tippen oder die Finger zusammenziehen, um die Kamera zu zoomen. Wenn scrollGestures aktiviert sind, kann die Kamera durch Doppeltippen oder Zusammen- oder Auseinanderziehen der Finger auf den angegebenen Punkt geschwenkt werden.
  • tiltGestures: Steuert, ob Neigungsgesten aktiviert oder deaktiviert sind. Wenn diese Option aktiviert ist, können Nutzer die Kamera mit zwei Fingern vertikal nach unten oder oben neigen.
  • rotateGestures: Steuert, ob Drehgesten aktiviert oder deaktiviert sind. Wenn diese Option aktiviert ist, können Nutzer die Kamera mit einer Drehbewegung mit zwei Fingern drehen.

In diesem Beispiel wurden sowohl die Schwenk- als auch die Zoomgesten deaktiviert.

Swift

mapView.settings.scrollGestures = false
mapView.settings.zoomGestures = false

Objective-C

mapView.settings.scrollGestures = NO;
mapView.settings.zoomGestures = NO;

Positionselemente und UI-Elemente

Mit den folgenden Eigenschaften können Sie Steuerelemente und andere UI-Elemente relativ zur Position des Navigationsheaders und ‑footers positionieren:

  • navigationHeaderLayoutGuide
  • navigationFooterLayoutGuide
  • bottomTrailingButtonsLayoutGuide

Im folgenden Codebeispiel wird gezeigt, wie Sie mit den Layout-Hilfslinien ein Paar Labels in der Kartenansicht positionieren:

Swift

/* Add a label to the top left, positioned below the header. */
let topLabel = UILabel()
topLabel.text = "Top Left"
mapView.addSubview(topLabel)
topLabel.translatesAutoresizingMaskIntoConstraints = false
topLabel.topAnchor.constraint(equalTo: mapView.navigationHeaderLayoutGuide.bottomAnchor).isActive = true
topLabel.leadingAnchor.constraint(equalTo: mapView.leadingAnchor).isActive = true

/* Add a label to the bottom right, positioned above the footer. */
let bottomLabel = UILabel()
bottomLabel.text = "Bottom Right"
mapView.addSubview(bottomLabel)
bottomLabel.translatesAutoresizingMaskIntoConstraints = false
bottomLabel.bottomAnchor.constraint(equalTo: mapView.navigationFooterLayoutGuide.topAnchor).isActive = true
bottomLabel.trailingAnchor.constraint(equalTo: mapView.trailingAnchor).isActive = true

Objective-C

/* Add a label to the top left, positioned below the header. */
UILabel *topLabel = [[UILabel alloc] init];
topLabel.text = @"Top Left";
[view addSubview:topLabel];
topLabel.translatesAutoresizingMaskIntoConstraints = NO;
[topLabel.topAnchor
    constraintEqualToAnchor:mapView.navigationHeaderLayoutGuide.bottomAnchor].active = YES;
[topLabel.leadingAnchor constraintEqualToAnchor:mapView.leadingAnchor].active = YES;

/* Add a label to the bottom right, positioned above the footer. */
UILabel *bottomLabel = [[UILabel alloc] init];
bottomLabel.text = @"Bottom Right";
[view addSubview:bottomLabel];
bottomLabel.translatesAutoresizingMaskIntoConstraints = NO;
[bottomLabel.bottomAnchor
    constraintEqualToAnchor:mapView.navigationFooterLayoutGuide.topAnchor].active = YES;
[bottomLabel.trailingAnchor constraintEqualToAnchor:mapView.trailingAnchor].active = YES;

Ein Beispiel für die Verwendung eines bottomTrailingButtonsLayoutGuide zum Positionieren der Schaltfläche für Echtzeitstörungen finden Sie unter Echtzeitstörungen konfigurieren.

Alternative Routen ausblenden

Wenn die Benutzeroberfläche mit zu vielen Informationen überladen ist, können Sie die Unordnung reduzieren, indem Sie weniger alternative Routen als die Standardanzahl (zwei) oder gar keine alternativen Routen anzeigen. Sie können diese Option konfigurieren, bevor Sie die Routen abrufen. Konfigurieren Sie dazu GMSNavigationRoutingOptions und legen Sie für alternateRoutesStrategy einen der folgenden Aufzählungswerte fest:

AufzählungswertBeschreibung
GMSNavigationAlternateRoutesStrategyAll Standard. Es werden bis zu zwei alternative Routen angezeigt.
GMSNavigationAlternateRoutesStrategyOne Zeigt eine alternative Route an, sofern verfügbar.
GMSNavigationAlternateRoutesStrategyNone Alternative Routen werden ausgeblendet.

Beispiel

Im folgenden Codebeispiel wird gezeigt, wie Sie alternative Routen vollständig ausblenden.

Swift

let routingOptions = GMSNavigationRoutingOptions(alternateRoutesStrategy: .none)
navigator?.setDestinations(destinations,
                           routingOptions: routingOptions) { routeStatus in
  ...
}

Objective-C

GMSNavigationRoutingOptions *routingOptions = [[GMSNavigationRoutingOptions alloc] initWithAlternateRoutesStrategy:GMSNavigationAlternateRoutesStrategyNone];
[navigator setDestinations:destinations
            routingOptions:routingOptions
                  callback:^(GMSRouteStatus routeStatus){...}];