Используя SDK навигации для iOS, вы можете изменить пользовательский интерфейс карты, определив, какие из встроенных элементов управления и компонентов интерфейса будут отображаться на карте, и какие жесты разрешены. Вы также можете изменить внешний вид интерфейса навигации. Рекомендации по допустимым изменениям интерфейса навигации см. на странице «Политика» .
Элементы управления пользовательского интерфейса карты
SDK навигации предоставляет ряд встроенных элементов управления пользовательского интерфейса, аналогичных тем, что используются в приложении Google Maps для iOS. Вы можете переключать видимость этих элементов управления с помощью класса GMSUISettings . Изменения, внесенные в этот класс, немедленно отображаются на карте.
Компас
В состав Navigation SDK входит графический компас, который появляется в правом верхнем углу карты при определенных условиях и только при включении этой функции. Когда пользователь щелкает по компасу, камера анимируется, возвращаясь в положение с нулевым азимутом (ориентация по умолчанию), и компас вскоре исчезает.
Если навигация включена и режим камеры установлен на «следование», компас остается видимым, а касание компаса переключает между наклонным и общим ракурсами камеры.
Чтобы избежать отвлечения внимания водителя, компас остается в том же положении, если заголовок (в портретном режиме) расширяется и конфликтует с положением компаса по умолчанию. Если вы добавите дополнительный элемент управления в заголовок или дополнительное представление заголовка, компас будет скрыт во избежание конфликтов пользовательского интерфейса.
Компас поддерживает дневной и ночной режимы, а также темный режим.
Компас по умолчанию отключен. Вы можете включить компас, установив свойство compassButton объекта GMSUISettings в true . Однако вы не можете заставить компас отображаться постоянно.
Быстрый
mapView.settings.compassButton = true
Objective-C
mapView.settings.compassButton = YES;
Кнопка "Мое местоположение"
Кнопка «Мое местоположение» появляется в правом нижнем углу экрана только тогда, когда кнопка «Мое местоположение» активирована. При нажатии пользователем этой кнопки камера анимируется, фокусируясь на текущем местоположении пользователя, если это местоположение известно. Вы можете активировать кнопку, установив свойство myLocationButton объекта GMSUISettings в true .
Быстрый
mapView.settings.myLocationButton = true
Objective-C
mapView.settings.myLocationButton = YES;
Кнопка "Центрировать"
При включенной навигации кнопка центрирования появляется при прокрутке карты и исчезает при касании для её повторного центрирования. Чтобы кнопка центрирования отображалась, установите свойство recenterButtonEnabled объекта GMSUISettings в true . Чтобы кнопка центрирования не отображалась, установите свойство recenterButtonEnabled в false .
Быстрый
mapView.settings.isRecenterButtonEnabled = true
Objective-C
mapView.settings.recenterButtonEnabled = YES;
Аксессуары пользовательского интерфейса карты
SDK навигации предоставляет элементы пользовательского интерфейса, которые отображаются во время навигации, аналогично тем, что используются в приложении Google Maps для iOS. Вы можете настроить видимость или внешний вид этих элементов управления, как описано в этом разделе. Внесенные здесь изменения будут отображаться во время следующей поездки пользователя.
Навигационный заголовок и нижний колонтитул

Во время навигации заголовок навигации отображается в верхней части экрана, а нижний колонтитул — в нижней. В заголовке навигации отображается название улицы и направление к следующему повороту на маршруте, а также направление к следующему повороту. В нижнем колонтитуле навигации отображается расчетное время и расстояние до пункта назначения, а также расчетное время прибытия.
Вы можете переключать видимость заголовка и нижнего колонтитула навигации, а также программно устанавливать их цвета, используя следующие свойства:
-
navigationHeaderEnabled— определяет, будет ли виден заголовок навигации (по умолчанию —true). -
navigationFooterEnabled— определяет, будет ли виден нижний колонтитул навигации (по умолчанию —true). -
navigationHeaderPrimaryBackgroundColor— задает основной цвет фона для заголовка навигации. -
navigationHeaderSecondaryBackgroundColor— задает дополнительный цвет фона для заголовка навигации.
В следующем примере кода показано включение видимости для заголовка и нижнего колонтитула, а затем установка navigationHeaderPrimaryBackgroundColor в синий цвет и navigationHeaderSecondaryBackgroundColor в красный цвет.
Быстрый
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];
Вид заголовка дополнительных элементов навигации
Вы можете настроить свое приложение, заменив заголовок вторичной навигации собственным пользовательским вспомогательным представлением. Для этого создайте представление, реализующее протокол GMSNavigationAccessoryView . Этот протокол имеет один обязательный метод: -heightForAccessoryViewConstrainedToSize:onMapView: Вам задается максимальный доступный размер для вашего представления на заданной карте, и вы должны указать высоту, необходимую для вашего представления.
Затем вы можете передать это представление в mapView, вызвав setHeaderAccessoryView: mapView анимирует исчезновение всех текущих представлений, а затем анимирует появление вашего пользовательского представления. Заголовок навигации должен быть видимым, чтобы ваше пользовательское представление могло отображаться.
Чтобы удалить пользовательский дополнительный элемент заголовка, передайте nil в setHeaderAccessoryView: .
Если размер вашего представления необходимо изменить в любой момент, вы можете вызвать invalidateLayoutForAccessoryView: передав в качестве параметра представление, размер которого необходимо изменить.
Пример
Приведенный ниже пример кода демонстрирует пользовательское представление, реализующее протокол GMSNavigationAccessoryView . Это пользовательское представление затем используется для установки дополнительного представления заголовка навигации.
Быстрый
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];
Обычный и режим низкой освещенности
Метод прослушивания GMSNavigatorListener.didChangeSuggestedLightingMode срабатывает при обновлении расчетных условий освещения. Например, когда в текущем местоположении устройства наступает ночь. Вы можете программно изменить поведение режима низкой освещенности следующими способами:
- Выбор режима работы (обычный или при слабом освещении) осуществляется с помощью перечисления
GMSNavigationLightingMode. - Выберите основной и дополнительный цвета фона для режима низкой освещенности, задав значения для свойств
navigationHeaderPrimaryBackgroundColorNightModeиnavigationHeaderSecondaryBackgroundColorNightMode.
Список указаний
В вашем приложении можно предоставить пошаговые инструкции. Следующий пример показывает один из возможных способов это сделать. Эти шаги могут отличаться в зависимости от вашей реализации.
- Включите кнопку точки входа после успешного завершения выполнения
setDestinationsвGMSNavigator(навигаторе) и включенияguidanceActiveв навигаторе. - При нажатии пользователем кнопки точки входа создайте контроллер
GMSNavigationDirectionsListController, в котором навигатор будет связан сGMSMapView(mapView). - Добавьте контроллер к экземпляру
UIViewController(контроллер представления) и добавьтеdirectionsListViewв качестве дочернего представления контроллера представления. МетодыreloadDataиinvalidateLayoutконтроллера следует вызывать так же, как и дляUICollectionView. - Поместите контроллер представления в иерархию контроллеров представлений приложения.
В следующем примере кода показано добавление элемента DirectionsListViewController .
Быстрый
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];
...
}
...
Индикатор выполнения поездки

Индикатор выполнения поездки — это вертикальная полоса, которая появляется в начале/передней части карты при запуске навигации. При включении она отображает общий обзор всей поездки, а также пункт назначения пользователя и его текущее местоположение.
Это позволяет пользователям быстро прогнозировать любые предстоящие проблемы, такие как пробки, без необходимости масштабирования. Затем они могут изменить маршрут поездки, если это необходимо. Если пользователь меняет маршрут, индикатор выполнения сбрасывается, как если бы с этого момента началась новая поездка.
Индикатор выполнения поездки отображает следующие показатели состояния:
Состояние дорожной ситуации — информация о предстоящем движении транспорта.
Текущее местоположение — текущее местоположение водителя во время поездки.
Пройденный маршрут — пройденный отрезок пути.
Включите индикатор выполнения поездки, установив свойство navigationTripProgressBarEnabled в GMSUISettings .
Быстрый
mapView.settings.isNavigationTripProgressBarEnabled = true
Objective-C
mapView.settings.navigationTripProgressBarEnabled = YES;
Расположение индикатора выполнения поездки
- Левая сторона полосы примерно совпадает с левой стороной спидометра, логотипа Google и кнопки «Перецентрировать» (если она видна). Ширина составляет 12 пунктов.
- Индикатор выполнения поездки динамически реагирует на вертикальное пространство экрана. Нижняя часть индикатора расположена на расстоянии 210 pt от нижнего края экрана. Верхняя часть индикатора остается на расстоянии не менее 170 pt от верхнего края экрана, а максимальная высота индикатора составляет 400 pt.
- Если индикатор выполнения поездки перекрывает карточку поворота или другие элементы пользовательского интерфейса навигации, он отображается под этими элементами.
API для отображения подсказок (экспериментальная версия)
API Prompt Visibility позволяет избежать конфликтов между элементами пользовательского интерфейса, созданными Navigation SDK, и вашими собственными пользовательскими элементами интерфейса, добавив обработчик событий, который будет получать обратный вызов перед появлением элемента пользовательского интерфейса Navigation SDK и сразу после его удаления. Для получения дополнительной информации, включая примеры кода, см. раздел «API Prompt Visibility» на странице «Настройка сбоев в реальном времени» .
Светофоры и знаки «Стоп»

В mapView можно включить отображение светофоров и знаков остановки во время активной навигации, что обеспечивает дополнительный контекст для маршрутов и маневров во время поездки.
По умолчанию в Navigation SDK для iOS светофоры и знаки «Стоп» отключены. Чтобы включить эту функцию, вызовите настройки GMSMapView для каждого параметра отдельно: showsTrafficLights и showsStopSigns .
Быстрый
mapView.settings.showsTrafficLights = true
mapView.settings.showsStopSigns = true
Objective-C
mapView.settings.showsTrafficLights = YES;
mapView.settings.showsStopSigns = YES;
управление спидометром
Когда навигация включена и режим поездки установлен на «вождение», SDK навигации для iOS отображает в нижнем углу карты индикатор ограничения скорости, показывающий текущее ограничение скорости. Когда водитель превышает ограничение скорости, индикатор расширяется, отображая второй спидометр с текущей скоростью водителя.
Вы можете установить уровни оповещения, чтобы изменять формат отображения спидометра, когда водитель превышает ограничение скорости на заданную величину. Например, вы можете указать, что текущая скорость будет отображаться красным цветом текста, когда водитель превышает ограничение скорости на 5 миль в час, и красным цветом фона, когда водитель превышает ограничение скорости на 10 миль в час.
Чтобы отобразить индикатор ограничения скорости, установите свойство shouldDisplaySpeedometer объекта GMSUISettings в true . Чтобы отключить отображение индикатора ограничения скорости, установите свойство shouldDisplaySpeedometer в значение false .
Быстрый
mapView.settings.shouldDisplaySpeedometer = true
Objective-C
mapView.settings.shouldDisplaySpeedometer = YES;
Для получения дополнительной информации о настройке оповещений для спидометра см. раздел «Настройка оповещений спидометра» .
Маркеры пункта назначения
Вы можете отображать или скрывать маркеры пункта назначения для заданного маршрута, установив свойство showsDestinationMarkers объекта GMSUISettings . В следующем примере показано отключение маркеров пункта назначения.
Быстрый
mapView.settings.showsDestinationMarkers = false
Objective-C
mapView.settings.showsDestinationMarkers = NO;
Функции работы с картой
SDK навигации предоставляет вам возможность вносить дополнительные изменения в навигацию для ваших пользователей. Изменения, внесенные вами в ваш экземпляр, будут отражены при следующем обновлении приложения пользователем.
Достопримечательности и входы.

При создании пункта назначения с placeID ) здание назначения будет выделено, и, по возможности, будет отображаться значок входа. Эти визуальные подсказки помогают пользователям различать и находить нужное им место назначения.
Чтобы создать пункт назначения с placeID , используйте один из инициализаторов GMSNavigationWaypoint , который принимает placeID . Например, пункты назначения, созданные в руководстве по прокладке маршрута, включают подсветку пункта назначения и метки входа, если они доступны.
3D-отображение здания во время навигации

По умолчанию во время навигации отображаются 3D-здания. Чтобы отключить эту функцию, установите для параметра buildingsEnabled значение false (Swift) или NO (Objective-C).
Отключить жесты на карте по умолчанию
Вы можете отключить стандартные жесты на карте, задав свойства класса GMSUISettings , который доступен в качестве свойства объекта GMSMapView . Следующие жесты можно включать и отключать программно. Обратите внимание, что отключение жеста не ограничивает программный доступ к настройкам камеры.
-
scrollGestures— управляет включением или отключением жестов прокрутки. Если включено, пользователи могут проводить пальцем по экрану для перемещения камеры. -
zoomGestures— управляет включением или отключением жестов масштабирования. Если включено, пользователи могут дважды коснуться экрана, коснуться двумя пальцами или сжать экран, чтобы увеличить масштаб камеры. Обратите внимание, что двойное касание или сжатие экрана при включенныхscrollGesturesможет переместить камеру в указанную точку. -
tiltGestures— управляет включением или отключением жестов наклона. Если включено, пользователи могут использовать вертикальный свайп двумя пальцами вниз или вверх для наклона камеры. -
rotateGestures— управляет включением или отключением жестов вращения. Если включено, пользователи могут использовать жест вращения двумя пальцами для поворота камеры.
В этом примере жесты панорамирования и масштабирования отключены.
Быстрый
mapView.settings.scrollGestures = false
mapView.settings.zoomGestures = false
Objective-C
mapView.settings.scrollGestures = NO;
mapView.settings.zoomGestures = NO;
Элементы управления положением и элементы пользовательского интерфейса
Вы можете размещать элементы управления и другие элементы пользовательского интерфейса относительно положения заголовка и нижнего колонтитула навигации, используя следующие свойства:
-
navigationHeaderLayoutGuide -
navigationFooterLayoutGuide -
bottomTrailingButtonsLayoutGuide
В следующем примере кода показано, как использовать направляющие компоновки для размещения пары меток на карте:
Быстрый
/* 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;
Пример использования элемента bottomTrailingButtonsLayoutGuide для размещения кнопки отображения информации о сбоях в реальном времени см. в разделе «Настройка отображения информации о сбоях в реальном времени» .
Скрыть альтернативные маршруты
Когда пользовательский интерфейс перегружен избытком информации, вы можете уменьшить её, отображая меньше альтернативных маршрутов, чем по умолчанию (два), или вообще не отображая альтернативные маршруты. Вы можете настроить этот параметр перед получением маршрутов, задав параметр GMSNavigationRoutingOptions и установив значение alternateRoutesStrategy одним из следующих значений перечисления:
| Значение перечисления | Описание |
|---|---|
| GMSNavigationAlternateRoutesStrategyAll | По умолчанию. Отображает до двух альтернативных маршрутов. |
| GMSNavigationAlternateRoutesStrategyOne | Отображает один альтернативный маршрут (если таковой имеется). |
| GMSNavigationAlternateRoutesStrategyNone | Скрывает альтернативные маршруты. |
Пример
Следующий пример кода демонстрирует, как полностью скрыть альтернативные маршруты.
Быстрый
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){...}];