A column has less room than a row, and the outer display in landscape overflows more often still. Without guidance the system cannot know that your compose button matters more than your sort button.
What overflows first
By default, items overflow from the bottom of the bar to the top. Apple’s guidance is to change that order in two steps: set priority on whole groups first, and only then on individual items inside a group when you need finer control. The types are ToolbarItemVisibilityPriority in SwiftUI and UIBarButtonItemVisibilityPriority in UIKit.
Keep the actions people use constantly — Compose in Mail, New Note in Notes — and anything carrying a status badge visible longest.
Assign visibility priority
.toolbar {
ToolbarItem { ComposeButton() }
.visibilityPriority(.high)
}
// UIKit
item.visibilityPriority = .high
Reserve .high for the few actions users reach for constantly. Marking everything high is the same as marking nothing.
Consolidate into the system overflow menu
Apps often grew their own ellipsis button next to the system one. On a vertical bar that reads as two identical menus. Move your items into the system menu:
.toolbar {
ToolbarOverflowMenu {
Button("Scan") { … }
Button("Connect") { … }
}
}
// UIKit
navigationItem.additionalOverflowItems = UIDeferredMenuElement({ provider in
provider(self.persistentOverflowItems())
})
Apple’s guidance is to reserve the ellipsis for overflow only, and to give any other menu its own distinct symbol.
Give every item a title and a symbol
Supply both, even when the bar shows only the symbol. The system chooses the representation for the context, and it uses the title inside overflow menus and expanded forms. In SwiftUI that means a Label; in UIKit, set both title and image on the UIBarButtonItem.
Keep text-only buttons to a minimum. An item whose label is text stays in a horizontal bar, so prefer a symbol wherever one works.
Group related items with ToolbarItemGroup or UIBarButtonItemGroup rather than spacing them by hand. Groups get the right spacing automatically and adapt as the space changes.
Tab bar or toolbar: decide which survives
When space runs out, one of them has to give. In a navigation-focused app, toolbar items move into the overflow menu so the tab bar stays reachable, which is the default. In a task-oriented app, minimise the tab bar instead and keep the toolbar actions the task depends on.
At the top of a vertical bar, place primary navigation such as Back or Close, followed by prominent actions such as Done. Keep controls that belong to a particular content area — the list controls above Mail’s message list, for example — with that area rather than moving them into the side bar.
Choose what compresses first
By default the toolbar compresses first, so a navigation-focused view keeps its tab bar. For a task-oriented view, prefer the toolbar items so the tab bar minimises instead. Set it per view:
.toolbarVerticalCompressionBehavior(.prefersToolbarItems)
// UIKit
navigationItem.verticalBarCompressionBehavior = .prefersBarItems
Badges still work
Badges introduced in iOS 26 carry over, and are a good way to keep a signal visible on an item that has lost its text label:
InboxButton().badge(7)
// UIKit
item.badge = .count(7)
How to verify
Audit each screen’s bar on the closed outer display and on the inner display in landscape, where bars sit at the side, and on the outer display in landscape, where overflow is heaviest. Confirm the actions you would put in a usability test are on screen rather than one tap deeper.