Breaking changes ⚠️
TileStore.loadTileRegionnow reports a partially downloaded region as a failure
The completion previously received success even when some of the region's resources had failed to download, leaving a manual comparison ofcompletedResourceCountagainstrequiredResourceCountas the only way to notice. It now completes withTileRegionError.partialLoad; the region is still usable but incomplete, and the load can be reattempted with anotherloadTileRegioncall.
Features ✨ and improvements 🏁
-
Camera bounds APIs now support the globe projection
MapboxMap.coordinateBounds(for:),coordinateBoundsUnwrapped(for:),coordinateBoundsZoom(for:)andcoordinateBoundsZoomUnwrapped(for:)computed bounds for a flat viewport, so under globe they reported an area that did not match what was on screen. They now use the same algorithm as Mapbox GL JS and return accurate bounds under both projections. -
Tile region load progress now reports network backoff
TileRegionLoadProgressgainedbackoffUntil, the earliest point at which any request in the region can proceed, along withtotalTransfersWithBackoffCountandtotalScheduledBackoffTimefor the load as a whole. Progress callbacks now also fire when a load stalls on backoff, so a download waiting out rate limiting is distinguishable from one that has stopped.
Bug fixes 🐞
-
UIKit view annotations never hid on overlap when using marked collision subviews
Subviews marked with the experimentalUIView.mbxViewAnnotationCollisionBoxwere measured before the annotation had laid out its subviews, so their collision boxes reached the renderer with zero size and no overlap was ever detected, even withallowOverlapset tofalse. Annotations that declare collision boxes are now laid out at their measured size before the boxes are collected. SwiftUI'sView.mbxViewAnnotationCollisionBox(_:)was never affected. -
Occluded symbols ignored the configured placement transition duration
Symbols hidden behind 3D buildings or terrain snapped between visible and hidden instead of fading, which shows up as flickering labels while the camera moves. Occlusion opacity is now advanced each frame from the time actually elapsed, soTransitionOptions.durationapplies to these fades unlessenablePlacementTransitionsis disabled. -
active-anchorexpression was silently accepted where it cannot be resolved
The active anchor is only known while symbols are being laid out, but the expression was allowed in filters,visibility, paint properties,text-anchor,text-variable-anchorand non-symbol layers, where it produced undefined results rather than an error. It is now rejected when the style is parsed, and remains available on the symbol layout properties that can resolve it. -
Raster tiles flashed empty when coming into view over terrain
With terrain enabled, raster tiles revealed by panning or zooming were drawn as an empty background until their own data finished loading. Under globe, such tiles already showed lower-resolution data from loaded tiles in the meantime, and the same fallback now applies with terrain. -
Location puck could disappear under 3D terrain after pitching the camera
After moving from a top-down view to a pitched one with terrain enabled, the puck could be hidden as if terrain covered it. It was tested against terrain depth data that hadn't been updated for the new camera yet. The puck's placement is now recomputed every frame and only checked against up-to-date terrain depth. -
Icons stuck on the wrong day/night appearance after changing the light preset
Layers whose properties depend onExp(.measureLight)brightness, such as icons that cross-fade between day and night images, could keep their previous appearance indefinitely after switchinglightPresetin the Standard style. The final brightness value arrived on a frame where these layers weren't re-evaluated, and nothing triggered a later update. Layers that read brightness are now re-evaluated whenever it changes.
Dependencies
- Update MapboxCommon to
24.32.0. - Update MapboxCoreMaps to
11.32.0.
Dependency requirements:
- Compatible version of Xcode:
26.5