Configuration:
Xcode 27.1 (27A9269)
iOS 27.1 Simulator (24A94401), iPhone Duo
macOS 27.2 (26B5086k)
On iOS 27.1, when the vertical bar is on the leading edge, UINavigationController adds a leading safe area inset for the vertical bar (84 pt on iPhone Duo outer display) that the window itself does not have. Bar layout guides (UIView.layoutGuide(for: .bar(onEdge:extent:))) requested from any view inside the navigation controller are then resolved against that inset instead of the actual bar strip:
Left-edge bar guides are pinned to x = 84 (the inner edge of the inset) instead of being centered in the vertical bar strip.
Top/bottom bar guides start at x = 84. This part matches the mirrored trailing-edge behavior.
The same guides requested from a view outside the navigation controller (the window's root view) put the left-edge guides correctly inside the strip, centered at x = 48. They are exact mirrors of the trailing-edge results.
With the vertical bar on the trailing edge, everything is consistent: the window itself carries the 84 pt trailing inset and an active occlusion reserved region for the vertical status bar, and guides are identical whether requested from inside or outside the navigation controller.
So the leading and trailing configurations are asymmetric. With a trailing bar, the vertical-bar inset lives on the window. With a leading bar, it exists only on UINavigationController's content, and the bar layout region math appears to treat it as an ordinary safe-area inset to avoid rather than as the bar strip.
This happens with the navigation bar hidden via setNavigationBarHidden(true, animated: false). (Hiding it by setting navigationBar.isHidden = true additionally shifts the top guides down, which we assume is expected since the controller still considers the bar visible.)
Steps to reproduce:
Build and run the attached sample on the iPhone Duo simulator (iOS 27.1), outer display, portrait.
Put the app in the configuration where traitCollection.verticalBarEdge == .leading.
With "Plain root" selected, note the yellow (left-edge) bar guides: 22/44/88 pt bands share one center line inside the leading strip.
Tap the center button and select "UINavigationController" (the navigation bar is hidden with setNavigationBarHidden(true, animated: false)).
Observe the yellow bands and check the console output (lines prefixed with [BarLayoutGuidePlayground]).
Repeat steps 3–5 with verticalBarEdge == .trailing and compare the green (right-edge) bands.
Expected results:
Bar layout guides resolve the same way for leading and trailing vertical bars, and the same way whether the requesting view is the window root or a child of UINavigationController. With a leading bar, the left-edge guides should be centered in the vertical bar strip (x = 37 / 26 / 4 for extents 22 / 44 / 88 in a 469 pt wide window), mirroring the trailing results (x = 410 / 399 / 377).
Actual results:
With a leading bar, inside UINavigationController:
view.safeAreaInsets = (top: 0, left: 84, bottom: 34, right: 0)
window.safeAreaInsets = (top: 0, left: 0, bottom: 34, right: 0)
left 22: (84, 16, 22, 619)
left 44: (84, 16, 44, 619)
left 88: (84, 16, 88, 619)
top 22: (84, 37, 376.33, 22)
Same guides requested from the window's root view:
left 22: (37, 16, 22, 619)
left 44: (26, 16, 44, 619)
left 88: (4, 16, 88, 619)
top 22: (16, 37, 444.33, 22)
With a trailing bar (identical from both views):
view.safeAreaInsets = (top: 0, left: 0, bottom: 34, right: 84)
window.safeAreaInsets = (top: 0, left: 0, bottom: 34, right: 84)
occlusion reserved region (active): (385, 0, 84, 120)
right 22: (410, 120, 22, 515)
right 44: (399, 120, 44, 515)
right 88: (377, 120, 88, 515)
top 22: (8.67, 37, 376.33, 22)
With a leading bar there is no active occlusion region for the status bar, and the window has no leading inset, yet UINavigationController adds one.
Sample project