Skip to content

Commit c0408a0

Browse files
persidskiygithub-actions[bot]
authored andcommitted
Introduce MapInitOptions.mapStyle (#7512)
GitOrigin-RevId: b5f374e78e77cd37d5c0b4df118c491fdffc9998
1 parent cf0775c commit c0408a0

File tree

10 files changed

+106
-22
lines changed

10 files changed

+106
-22
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ Mapbox welcomes participation and contributions from everyone.
66

77
* Introduced `ScaleBarViewOptions.units` property supporting metric, imperial, and nautical units, replacing the boolean `useMetricUnits` property.
88
* Fix crash in `OrnamentsManager` when setting attribution color.
9+
* Introduce `MapInitOptions.mapStyle` property. Use it to initialize map with a custom style.
10+
```swift
11+
// Before
12+
let options = MapInitOptions(styleURI: .standardSatellite)
13+
let mapView = MapView(frame: view.bounds, mapInitOptions: options)
14+
mapView.mapboxMap.setStyleImportConfigProperties(for: "basemap", configs: ["lightPreset": "dusk"])
15+
16+
// After:
17+
let options = MapInitOptions(mapStyle: .standardSatellite(lightPreset: .dusk))
18+
let mapView = MapView(frame: view.bounds, mapInitOptions: options)
19+
```
20+
21+
922
## 11.16.0 - 21 October, 2025
1023

1124
## 11.16.0-rc.2 - 14 October, 2025

Sources/Examples/All Examples/DebugMapExample.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ struct StyleJson: Codable {
412412
struct Metadata: Codable {
413413
let origin: String?
414414
let compatibility: Compatibility?
415-
415+
416416
enum CodingKeys: String, CodingKey {
417417
case origin = "mapbox:origin"
418418
case compatibility = "mapbox:compatibility"
@@ -424,4 +424,3 @@ struct Compatibility: Codable {
424424
let android: String?
425425
let js: String?
426426
}
427-

Sources/Examples/SwiftUI Examples/Util/ViewExtensions.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ extension Color {
5858
}
5959
}
6060

61-
6261
extension View {
6362
func simpleAlert(message: Binding<String?>, title: String = "Alert") -> some View {
6463
return alert(item: message) { item in

Sources/Examples/UseCases/PinPoweredMap/Models/FavoritesManager.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import MapboxMaps
33

44
class FavoritesManager: ObservableObject {
55
@Published var favoriteIds: Set<String> = []
6-
6+
77
func isFavorite(_ mapboxId: String) -> Bool {
88
return favoriteIds.contains(mapboxId)
99
}
@@ -22,15 +22,15 @@ class FavoritesManager: ObservableObject {
2222

2323
toggleFavorite(for: mapboxId)
2424
}
25-
25+
2626
func toggleFavorite(for mapboxId: String) {
2727
if favoriteIds.contains(mapboxId) {
2828
favoriteIds.remove(mapboxId)
2929
} else {
3030
favoriteIds.insert(mapboxId)
3131
}
3232
}
33-
33+
3434
var allFavoriteIds: [String] {
3535
return Array(favoriteIds)
3636
}

Sources/MapboxMaps/Foundation/MapInitOptions.swift

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ public final class MapInitOptions: NSObject {
1919
public let mapOptions: MapOptions
2020

2121
/// Style URI for initializing the map. Defaults to Mapbox Standard.
22-
public let styleURI: StyleURI?
22+
public var styleURI: StyleURI? { mapStyle?.data.asURI }
2323

2424
/// String representation of JSON style spec. Has precedence over ``styleURI``.
25-
public let styleJSON: String?
25+
public var styleJSON: String? { mapStyle?.data.asJson }
26+
27+
/// Map style for map initialization.
28+
public let mapStyle: MapStyle?
2629

2730
/// Camera options for initializing the map. CameraOptions default to 0.0 for each value.
2831
public let cameraOptions: CameraOptions?
@@ -45,17 +48,42 @@ public final class MapInitOptions: NSObject {
4548
/// can be `nil`.
4649
/// - styleJSON: Style JSON in String representation. Has precedence over ``styleURI``.
4750
/// - antialiasingSampleCount: Sample count to control multisample anti-aliasing (MSAA) option for rendering.
48-
public init(
51+
convenience public init(
4952
mapOptions: MapOptions = MapOptions(),
5053
cameraOptions: CameraOptions? = nil,
5154
styleURI: StyleURI? = .standard,
5255
styleJSON: String? = nil,
5356
antialiasingSampleCount: Int = 1
5457
) {
55-
self.mapOptions = mapOptions
56-
self.cameraOptions = cameraOptions
57-
self.styleURI = styleURI
58-
self.styleJSON = styleJSON
58+
let mapStyle: MapStyle? = if let styleJSON {
59+
MapStyle(json: styleJSON)
60+
} else if let styleURI {
61+
MapStyle(uri: styleURI)
62+
} else {
63+
nil
64+
}
65+
self.init(mapStyle: mapStyle,
66+
mapOptions: mapOptions,
67+
cameraOptions: cameraOptions,
68+
antialiasingSampleCount: antialiasingSampleCount)
69+
}
70+
71+
/// Creates new map init options.
72+
///
73+
/// - Parameters:
74+
/// - mapStyle: Map style to load, defaults to Mapbox Standard style.
75+
/// - mapOptions: Map rendering options.
76+
/// - cameraOptions: Camera options overriding the default camera that has been specified in the style.
77+
/// - antialiasingSampleCount: Sample count to control multisample anti-aliasing (MSAA) option for rendering.
78+
public init(
79+
mapStyle: MapStyle?,
80+
mapOptions: MapOptions = MapOptions(),
81+
cameraOptions: CameraOptions? = nil,
82+
antialiasingSampleCount: Int = 1
83+
) {
84+
self.mapOptions = mapOptions
85+
self.cameraOptions = cameraOptions
86+
self.mapStyle = mapStyle
5987
self.antialiasingSampleCount = antialiasingSampleCount
6088
}
6189

@@ -106,13 +134,17 @@ extension MapInitOptions {
106134
scaleFactor: mapOptions.__scaleFactor)
107135

108136
// Use the overriding style URI if provided (currently from IB)
109-
let resolvedStyleURI = overridingStyleURI.map { StyleURI(url: $0) } ?? styleURI
137+
let resolvedStyle = if let overridingStyleURI,
138+
let uri = StyleURI(url: overridingStyleURI) {
139+
MapStyle(uri: uri)
140+
} else {
141+
mapStyle
142+
}
110143

111144
return MapInitOptions(
145+
mapStyle: resolvedStyle,
112146
mapOptions: resolvedMapOptions,
113-
cameraOptions: cameraOptions,
114-
styleURI: resolvedStyleURI,
115-
styleJSON: styleJSON)
147+
cameraOptions: cameraOptions)
116148
} else {
117149
return self
118150
}

Sources/MapboxMaps/Foundation/MapView.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,8 @@ open class MapView: UIView, SizeTrackingLayerDelegate {
330330
object: nil
331331
)
332332

333-
if let initialStyleJSON = resolvedMapInitOptions.styleJSON {
334-
mapboxMap.mapStyle = MapStyle(json: initialStyleJSON)
335-
} else if let initialStyleURI = resolvedMapInitOptions.styleURI {
336-
mapboxMap.mapStyle = MapStyle(uri: initialStyleURI)
333+
if let mapStyle = resolvedMapInitOptions.mapStyle {
334+
mapboxMap.mapStyle = mapStyle
337335
}
338336

339337
if let cameraOptions = resolvedMapInitOptions.cameraOptions {

Sources/MapboxMaps/Style/MapStyle.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ public struct MapStyle: Equatable, Sendable {
6060
enum Data: Equatable, Sendable {
6161
case uri(StyleURI)
6262
case json(String)
63+
var asJson: String? {
64+
switch self {
65+
case .json(let json): json
66+
case .uri: nil
67+
}
68+
}
69+
var asURI: StyleURI? {
70+
switch self {
71+
case .json: nil
72+
case .uri(let uri): uri
73+
}
74+
}
6375
}
6476
var data: Data
6577
var configuration: JSONObject?

Sources/MapboxMaps/SwiftUI/Map.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ public struct Map: UIViewControllerRepresentable {
9797
public func makeCoordinator() -> Coordinator {
9898
let urlOpener = ClosureURLOpener()
9999
sendTelemetry(\.swiftUI)
100-
let mapView = MapView(frame: .zero, urlOpener: urlOpener)
100+
let initOptions = MapInitOptions(mapStyle: mapDependencies.mapStyle)
101+
let mapView = MapView(frame: .zero, mapInitOptions: initOptions, urlOpener: urlOpener)
101102
let viewController = MapViewController(mapView: mapView)
102103

103104
let mapContentDependencies = MapContentDependencies(

Tests/MapboxMapsTests/Foundation/MapInitOptionsTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,27 @@ class MapInitOptionsTests: XCTestCase {
2929

3030
XCTAssert(set.count == 1)
3131
}
32+
33+
func testStyleURI() {
34+
var me = MapInitOptions(styleURI: .standardSatellite)
35+
XCTAssertEqual(me.styleURI, .standardSatellite)
36+
XCTAssertEqual(me.mapStyle, MapStyle.standardSatellite)
37+
38+
me = MapInitOptions(mapStyle: .streets)
39+
XCTAssertEqual(me.styleURI, .streets)
40+
XCTAssertEqual(me.mapStyle, MapStyle.streets)
41+
}
42+
43+
func testStyleJSON() {
44+
let json = "{}"
45+
var me = MapInitOptions(styleJSON: json)
46+
XCTAssertEqual(me.styleURI, nil)
47+
XCTAssertEqual(me.styleJSON, json)
48+
XCTAssertEqual(me.mapStyle, MapStyle(json: json))
49+
50+
me = MapInitOptions(mapStyle: MapStyle(json: json))
51+
XCTAssertEqual(me.styleURI, nil)
52+
XCTAssertEqual(me.styleJSON, json)
53+
XCTAssertEqual(me.mapStyle, MapStyle(json: json))
54+
}
3255
}

Tests/MapboxMapsTests/Foundation/MapViewTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,13 @@ final class MapViewTestsWithScene: XCTestCase {
441441
super.tearDown()
442442
}
443443

444+
func testMapStyleInInitOptions() throws {
445+
XCTAssertEqual(mapView.mapboxMap.mapStyle, .standard)
446+
let mapStyle = MapStyle.outdoors
447+
var aView = MapView(frame: .zero, mapInitOptions: MapInitOptions(mapStyle: mapStyle))
448+
XCTAssertEqual(aView.mapboxMap.mapStyle, mapStyle)
449+
}
450+
444451
func testDisplayLinkResumedWhenSceneDidActivate() throws {
445452
guard #available(iOS 13.0, *) else {
446453
throw XCTSkip("Test requires iOS 13 or higher.")

0 commit comments

Comments
 (0)