Map styles
Стили карты
Для работы со стилями нужно создать объект IStyleFactory с помощью метода makeStyleFactory().
let styleFactory = try sdk.makeStyleFactory()
Чтобы создать стиль карты, совместимый с SDK, воспользуйтесь функцией «Экспорт» в Редакторе стилей и добавьте скачанный файл в ваш проект.
DGis.xcframework
содержит файл со стилями карты по умолчанию. Если в приложении будет использоваться пользовательский стиль, то файл со стилями карты по умолчанию можно удалить. Для этого удаляем файлы DGis.xcframework/ios-arm64/DGis.framework/Assets/ru.dgis.sdk/common-styles.2gis
и DGis.xcframework/ios-arm64_x86_64-simulator/DGis.framework/Assets/ru.dgis.sdk/common-styles.2gis
.
Создание карты с пользовательским стилем
Чтобы создать карту с произвольным стилем, нужно загрузить нужный стиль с помощью метода loadResource() или loadFile() фабрики стилей и указать получившийся объект в качестве параметра styleFuture
в настройках карты.
// Создаём фабрику стилей.
let styleFactory = try sdk.makeStyleFactory()
// Устанавливаем начальный стиль карты в настройках.
var mapOptions = MapOptions.default
mapOptions.styleFuture = styleFactory.loadResource(name: "custom_style_file.2gis", bundle: .main)
// Создаём карту с указанными настройками.
let mapFactory = try sdk.makeMapFactory(options: mapOptions)
Методы loadResource() и loadFile() возвращают отложенное значение (Future), чтобы не задерживать загрузку карты. Если стиль уже был загружен (см. следующий раздел), его можно превратить в объект Future с помощью метода makeReadyValue().
var mapOptions = MapOptions.default
mapOptions.styleFuture = Future.makeReadyValue(style)
Изменение стиля карты
Изменить стиль существующей карты можно при помощи метода setStyle().
В отличие от указания стиля при создании карты, setStyle() принимает не Future, а загруженный стиль карты (Style). Поэтому setStyle() следует вызывать после завершения загрузки Future.
// Создаём фабрику стилей.
let styleFactory = try sdk.makeStyleFactory()
// Загружаем новый стиль карты. Метод loadFile() принимает только локальные URL (file://).
self.cancellable = styleFactory.loadFile(url: styleFileURL).sink(
receiveValue: { [map = self.map] style in
// Меняем стиль карты после загрузки.
map.setStyle(style: style)
},
failure: { error in
print("Не удалось загрузить стиль из файла <\(fileURL)>. Ошибка: \(error)")
})
Светлые и тёмные темы
Стили карты могут содержать несколько тем (например, дневную и ночную), между которыми можно переключаться без необходимости загрузки дополнительного стиля. Название используемой темы можно указать при создании карты с помощью параметра appearance.
В iOS 13.0 и выше можно использовать автоматическое переключение между светлой и тёмной темами (см. Dark Mode).
// Настройки карты.
var mapOptions = MapOptions.default
// Название светлой темы в используемом стиле.
let lightTheme: Theme = "day"
// Название тёмной темы в используемом стиле.
let darkTheme: Theme = "night"
if #available(iOS 13.0, *) {
// Автоматически переключаемся между темами в iOS 13.0.
mapOptions.appearance = .automatic(light: lightTheme, dark: darkTheme)
} else {
// Используем светлую тему в остальных случаях.
mapOptions.appearance = .universal(lightTheme)
}
// Создаём карту с указанными настройками.
let mapFactory = sdk.makeMapFactory(options: mapOptions)
Изменить тему после создания карты можно с помощью свойства appearance слоя карты:
// Слой карты.
let mapView = mapFactory.mapView
// Меняем тему на тёмную.
mapView.appearance = .universal(darkTheme)