Skip to content

v11.26.0

Latest

Choose a tag to compare

Mapbox Maps SDK for iOS — 11.26.0

Note

Mapbox will end support for CocoaPods in December 2026. After that date, new versions of the Mapbox Maps SDK for iOS will not be published to CocoaPods. We recommend installing the SDK via Swift Package Manager to continue receiving updates.

Features ✨ and improvements 🏁

  • View annotations can now avoid specific screen regions
    ViewAnnotationManager.viewAnnotationAvoidRegions lets you mark rectangular screen regions — for example, the area under a toolbar or bottom sheet — that view annotations should steer clear of. A view annotation opts in to this behavior via the new experimental ViewAnnotation.enableAvoidRegions option.

  • View annotations can now suppress conflicting map symbols
    The new experimental ViewAnnotation.enableSymbolLayerCollision option (MapViewAnnotation.enableSymbolLayerCollision() in SwiftUI) registers the annotation's bounding box with the symbol placement engine, so map labels and icons that would overlap it are hidden automatically. By default the full bounding box participates in collision; for non-rectangular annotations, mark the specific subviews that should contribute via the new experimental UIView.mbxViewAnnotationCollisionBox (View.mbxViewAnnotationCollisionBox() in SwiftUI). View annotation collision boxes are also drawn when MapView.debugOptions includes .collision.

  • Marker automatically hides symbols beneath it
    Marker now enables symbol-layer collision internally, so road names and POI labels that fall under its icon or label text are suppressed without any additional configuration.

  • SwiftUI Experimental Map.viewAnnotationAvoidLayers()
    A new experimental modifier lets you specify layer IDs whose features the view annotation placement algorithm should avoid, enabling navigation-style use cases where annotations must stay clear of specific rendered layers.

  • Camera field of view now animates through the SDK's animation system
    CameraOptions.verticalFov could already be set directly via easeTo/flyTo, but changing it through the SDK's higher-level camera animation system snapped straight to the new value instead of transitioning smoothly. verticalFov now animates there too, along with the other camera parameters.

  • Configurable limit for TileStore's ambient cache
    TileStore already let you cap total disk usage for offline data, but the separate budget for its "ambient" cache — tiles and resources not tied to any downloaded region — was fixed internally at 1 GB. You can now set this limit yourself via TileStoreOptions.ambientCacheEvictionQuota, giving more control over how much local storage TileStore uses for cached-but-unpinned map data.

  • Lines can now resolve elevation from a separate source
    A line using LineLayer.lineElevationReference set to .hdRoadMarkup previously could only pick up elevation baked into that line feature's own tile. It can now resolve elevation from a dedicated elevation source published separately from the line data, correctly handling different max zoom levels and tile boundaries between the two. The line stays flat until matching elevation data has loaded, rather than flashing on the ground and then jumping up.

Bug fixes 🐞

  • Missing labels on multiline street features
    The line-merging pass that prepares features for label placement assumed each feature contained a single linestring and silently dropped extra geometry rings. A street that crossed a tile boundary as a multilinestring produced fewer labels than expected. The pass now expands each linestring into its own feature before merging, so every segment is labeled correctly.

  • Gaps could appear in elevated route lines at elevation boundaries
    A line rendered with LineLayer.lineElevationReference could show small vertical or horizontal gaps where two elevation features met. Adjacent segments now share the same height at their shared endpoint, closing the gaps.

  • Elevated HD road-markup lines could keep reparsing indefinitely with a static camera
    A line using LineLayer.lineElevationReference set to .hdRoadMarkup could enter a loop that continuously reparsed the same tiles even with a static camera, driving up CPU usage indefinitely. An internal readiness signal is now tracked separately from the check that detects real data changes.

  • View annotation placement blocked on short road segments
    The collision grid used during symbol placement ran at 64×64 cells per tile. On short segments, the coarse cell footprint overstated the occupied area and blocked view annotation placement even when space was available. The grid now runs at 128×128 cells, which matches the actual geometry much more closely.

  • Worldview filter not applied after switching worldviews at runtime
    Worldview is now a first-class member of the expression evaluation context rather than a side-channel value. Re-evaluating any property that depends on it after a change now produces the correct filtered result consistently.

  • Different interpolate zoom expressions across appearances not rendering correctly
    When two appearances overrode the same symbol paint property with interpolate zoom expressions that had different stop sets, a single shared zoom-factor uniform was used for all of them, producing incorrect output. The renderer now stores a per-feature zoom range and derives each feature's interpolation factor independently.

  • icon-image-cross-fade not working for images redefined in appearances
    Appearance overrides that redefined an image prevented the cross-fade transition from running when the image changed. The transition now applies correctly to images overridden via appearances.

  • Elevated symbols not displaying on rotated or pitched maps
    Symbols with symbolZOffset or symbolElevationReference could be incorrectly classified as drapable at layout time, causing them to disappear when the map was rotated or pitched. Draping is now disabled for all symbol layers, which matches the expected behavior.

  • Location indicator showing pink lines or rotating around the wrong center with non-square images
    Padding the indicator image to a power-of-two size left uninitialized texture memory around the original, which appeared as pink lines (most visible in Simulator). Separately, the SDK assumed square images when computing the rotation pivot, so non-square images — including the default navigation puck — rotated around the wrong center. Both issues are fixed.

  • Layers could briefly disappear for a single frame while a style was loading
    When a layer needed a new shader variant on the fly — for example, when a ModelLayer with modelCastShadows enabled streamed in — the layer was skipped entirely until the new variant finished compiling, causing a one-frame flash where it vanished. The renderer now keeps drawing with the previous compatible shader while the new variant compiles.

  • Occasional rendering glitches during parallel shader compilation on Metal
    The Metal renderer's parallel shader compilation and upload path had a couple of bugs: buffers could be marked ready before their upload had actually finished, and the pipeline cache didn't account for blend color when reusing a cached pipeline. Both are fixed, so parallel shader compilation is enabled by default again.

  • Crash when querying rendered features
    A dangling reference to a tile's source layer identifier could be read after the underlying data had been freed, crashing the app during MapboxMap.queryRenderedFeatures. The indexed feature now holds its own reference-counted copy of the source layer id instead of a dangling reference.

  • Crash during offline tile decompression
    Evicting a cached Zstandard frame captured a reference into the front element of an internal queue and then popped the element, leaving the reference dangling. Under sustained eviction pressure, a subsequent read through that reference caused a heap-use-after-free. The entry is now copied by value before the queue is modified.

Performance improvements 🚀

  • Faster TileStore operations on large offline databases
    Several operations that computed group metadata on every call now cache results across calls. On a database with approximately 1.4 million tiles, operations such as opening the tile store or listing offline regions are up to 99% faster, and write operations are 70–94% faster.

  • More accurate terrain raycasting
    The terrain raycast — used for feature queries, camera fitting, and fog — previously tested only four corner samples per leaf in the DEM quad-tree, missing peaks between corners. The raycast now sweeps an 8×8 grid within each leaf and uses accurate min/max values at every mipmap level, so the returned coordinate consistently matches the queried screen position.

  • Faster resource loading for 3D model layers on Metal
    Uploading GPU resources (vertex/index buffers and textures) for ModelLayer content now happens in parallel with the main rendering work on Metal instead of serially, reducing stalls when new 3D models stream in.

Dependencies

  • Update MapboxCommon to 24.26.0.
  • Update MapboxCoreMaps to 11.26.0.

Dependency requirements:

  • Compatible version of Xcode: 26.3