iOS components — the rules that make controls feel native (iOS 26)
Source: Apple HIG component pages (read June 2026). iOS 26 floats chrome on Liquid Glass — read ios-liquid-glass-swiftui for the material behavior; this is the per-component rulebook.
Bars
Tab bar — top-level navigation, not actions. Floats on glass at the bottom; content peeks through. 2–5 destinations (more → a "More" tab; avoid). Don't hide/disable tab items when their content is empty — explain the empty state instead. Single-word labels; prefer filled SF Symbols. iOS 26: optional dedicated search tab at the trailing end; optional minimize-on-scroll. Badges (red oval) only for critical info.
Navigation bar = a navigation-specific toolbar at the top. Large title by default, collapses to inline on scroll (keep this). Use the standard Back/Close symbols — don't label them "Back"/"Close". Use inline title on dense utility screens.
Toolbar — horizontal control groups along top/bottom. iOS 26: "Reduce the use of toolbar backgrounds and tinted controls"; let the content layer inform the toolbar's color; use a scroll edge effect to separate it. Standard components get corner radii concentric with the bar — keep custom ones concentric too. Prefer borderless system symbols. .prominent style for the one primary action (Done/Submit), on the trailing side. Aim for ≤3 logical groups; titles <15 chars; never title with the app name. iOS: keep only the most important items in the bar, push the rest to a More menu.
Search — give it a primary position if important (Notes = bottom toolbar; Photos = a Search tab). Make content searchable from a single location; show scope via placeholder/scope bar/title; provide recent + predictive suggestions; let people clear history. .searchable(text:) + .searchToolbarBehavior(.minimize).
Buttons & actions
- Hit region ≥ 44×44 pt (visionOS 60). Always include a press state for custom buttons.
- Use style, not size, to mark the preferred action. One or two prominent buttons per view max.
- Roles: Normal, Primary (accent, responds to Return), Cancel, Destructive (system red). Never assign the primary role to a destructive action — people tap primary without reading.
- Verb-first title-case labels; familiar SF Symbols for familiar actions (
square.and.arrow.up = share). iOS: show an activity indicator for non-instant actions ("Checkout" → "Checking out…").
- Menus: title-case, drop articles, "…" when more input needed, dim unavailable items. iOS layouts: Small (4 symbol-only), Medium (3 symbol+label), Large (default list). Pull-down = actions / multi-select / submenu (≥3 items feels worthwhile); Pop-up = mutually-exclusive options, button shows current selection.
Selection & input
- Toggle/switch: "Use the switch toggle style only in a list row." Outside a list, use a toggle-styled button, not a switch. Don't rely on color alone for state.
- Picker: medium-long value lists; show in context (bottom/popover), "avoid switching views to show a picker." Date picker styles: compact / inline / wheels / automatic.
- Segmented control: ≤ ~5 segments on iPhone; single choice among closely-related subviews; text or images, not both. For separate app sections use a tab bar instead.
- Slider: min leading / max trailing; don't use a slider for audio volume. Pair with a field+stepper for exact values.
- Stepper: doesn't show its own value — sits next to a field that does; pair with a text field for large changes.
- Text field: show a placeholder hint and a persistent label; secure field for sensitive data; correct keyboard type; trailing Clear button; validate at the right moment (email on field-switch). Never prepopulate a password field.
Content
- Lists & tables: prefer text in lists; for varied/image-heavy items use a collection. iOS inset-grouped style for settings/forms (headers/footers/space separate groups). Disclosure indicator = drill into a subview; info/detail button = reveal more about a row (not navigation).
- Collections: image-based content; standard row/grid layouts; use a table for text.
- Scroll views: iOS 26 scroll edge effect separates floating chrome from content — "only use it when a scroll view is behind floating interface elements… not decorative," one per view, prefer the automatic style. Don't nest same-axis scroll views.
- Charts: see
data-visualization; make every chart accessible (VoiceOver + Audio Graphs via Swift Charts), don't rely on color alone, add a descriptive takeaway.
Presentation (pick the right one)
- Sheet — a scoped task related to the current context. Detents: system
.large + .medium; "consider supporting the medium detent to allow progressive disclosure" on iPhone. Include a grabber on resizable sheets. Cancel = leading, Done = trailing; support swipe-to-dismiss (confirm if unsaved changes). One sheet at a time. Complex/long flow → full-screen modal instead.
- Popover — transient, arrow points at the triggering control; avoid in compact (iPhone) width — use a sheet; never use a popover for a warning (use an alert).
- Alert — critical, time-sensitive, ideally actionable; ≤3 buttons. Use sparingly; "avoid using an alert merely to provide information"; don't alert on common undoable destructive actions; never alert at launch. Default/most-likely button trailing/top, Cancel leading/bottom; destructive style only when the user didn't deliberately choose it; always include Cancel with a destructive action; never make Cancel default.
- Action sheet (
confirmationDialog) — choices tied to an intentional action. Cancel at the bottom; destructive choices prominent at the top. Use this — not an alert — for choices on a user-initiated action.
- Modality — present modally only with a clear benefit; keep modal tasks short; always give an obvious dismissal; confirm before closing if content would be lost; one modal at a time (an alert may appear above another modal).
Status
- Progress: prefer determinate when duration is known; report accurately, keep it moving; "don't switch from the circular style to the bar style." iOS pull-to-refresh control optional.
- Gauge: single value in a range (standard = indicator, capacity = fill); succinct value + endpoint labels for VoiceOver.
Greg application
- Bottom tab bar for the 3–5 top sections (filled symbols); toolbar
+ for actions, not navigation.
- "Log food" flows open as a sheet at
.medium (progressive disclosure), draggable to .large.
- Allergy/irreversible confirmations: action sheet with destructive-styled choice on intentional actions; reserve alerts for true safety stops.
- Profile/targets editing: inset-grouped list; switches only in rows; numeric entry with a stepper+field and the right keyboard type.
- One prominent (tangerine) primary button per screen; everything else secondary/plain.
Pairs with: ios-liquid-glass-swiftui, ios-flows-and-patterns (modality/feedback), ios26-hig-patterns.
1---2name: ios-components3description: Apple HIG component rules for native iOS 26 — bars (tab/nav/toolbar/search incl. floating + concentric corners), buttons (44pt hit region, prominence, roles, no destructive-primary), menus/pull-down/pop-up, toggles/pickers/segmented/sliders/steppers/text fields, lists & tables, sheets + detents, alerts vs action sheets vs popovers, modality, progress/gauges, with the SwiftUI mapping. Use when choosing or reviewing any iOS control or presentation.4---5# iOS components — the rules that make controls feel native (iOS 26)67Source: Apple HIG component pages (read June 2026). iOS 26 floats chrome on Liquid Glass — read `ios-liquid-glass-swiftui` for the material behavior; this is the per-component rulebook.89## Bars10**Tab bar** — top-level *navigation*, not actions. Floats on glass at the bottom; content peeks through. 2–5 destinations (more → a "More" tab; avoid). **Don't hide/disable tab items** when their content is empty — explain the empty state instead. Single-word labels; **prefer filled SF Symbols**. iOS 26: optional dedicated **search tab** at the trailing end; optional **minimize-on-scroll**. Badges (red oval) only for critical info.1112**Navigation bar** = a navigation-specific toolbar at the top. **Large title by default**, collapses to inline on scroll (keep this). Use the **standard Back/Close** symbols — *don't* label them "Back"/"Close". Use inline title on dense utility screens.1314**Toolbar** — horizontal control groups along top/bottom. iOS 26: *"Reduce the use of toolbar backgrounds and tinted controls"*; let the content layer inform the toolbar's color; use a scroll edge effect to separate it. **Standard components get corner radii concentric with the bar** — keep custom ones concentric too. Prefer **borderless** system symbols. **`.prominent` style for the one primary action (Done/Submit), on the trailing side.** Aim for ≤3 logical groups; titles <15 chars; never title with the app name. iOS: keep only the most important items in the bar, push the rest to a **More** menu.1516**Search** — give it a primary position if important (Notes = bottom toolbar; Photos = a Search tab). Make content searchable from a single location; show scope via placeholder/scope bar/title; provide recent + predictive suggestions; let people clear history. `.searchable(text:)` + `.searchToolbarBehavior(.minimize)`.1718## Buttons & actions19- **Hit region ≥ 44×44 pt** (visionOS 60). Always include a **press state** for custom buttons.20- **Use style, not size, to mark the preferred action.** One or two prominent buttons per view max.21- **Roles:** Normal, Primary (accent, responds to Return), Cancel, Destructive (system red). **Never assign the primary role to a destructive action** — people tap primary without reading.22- Verb-first title-case labels; familiar SF Symbols for familiar actions (`square.and.arrow.up` = share). iOS: show an activity indicator for non-instant actions ("Checkout" → "Checking out…").23- **Menus:** title-case, drop articles, "…" when more input needed, dim unavailable items. iOS layouts: Small (4 symbol-only), Medium (3 symbol+label), Large (default list). **Pull-down** = actions / multi-select / submenu (≥3 items feels worthwhile); **Pop-up** = mutually-exclusive options, button shows current selection.2425## Selection & input26- **Toggle/switch:** *"Use the switch toggle style only in a list row."* Outside a list, use a toggle-styled **button**, not a switch. Don't rely on color alone for state.27- **Picker:** medium-long value lists; show in context (bottom/popover), *"avoid switching views to show a picker."* Date picker styles: compact / inline / wheels / automatic.28- **Segmented control:** ≤ ~5 segments on iPhone; single choice among closely-related subviews; text *or* images, not both. For separate app sections use a tab bar instead.29- **Slider:** min leading / max trailing; **don't use a slider for audio volume**. Pair with a field+stepper for exact values.30- **Stepper:** doesn't show its own value — sits next to a field that does; pair with a text field for large changes.31- **Text field:** show a placeholder hint **and** a persistent label; secure field for sensitive data; correct keyboard type; trailing **Clear** button; validate at the right moment (email on field-switch). **Never prepopulate a password field.**3233## Content34- **Lists & tables:** prefer text in lists; for varied/image-heavy items use a **collection**. iOS **inset-grouped** style for settings/forms (headers/footers/space separate groups). **Disclosure indicator** = drill into a subview; **info/detail button** = reveal more about a row (not navigation).35- **Collections:** image-based content; standard row/grid layouts; use a table for text.36- **Scroll views:** iOS 26 **scroll edge effect** separates floating chrome from content — *"only use it when a scroll view is behind floating interface elements… not decorative,"* **one per view**, prefer the **automatic** style. Don't nest same-axis scroll views.37- **Charts:** see `data-visualization`; make every chart accessible (VoiceOver + Audio Graphs via Swift Charts), don't rely on color alone, add a descriptive takeaway.3839## Presentation (pick the right one)40- **Sheet** — a scoped task related to the current context. **Detents:** system `.large` + `.medium`; *"consider supporting the medium detent to allow progressive disclosure"* on iPhone. Include a **grabber** on resizable sheets. Cancel = leading, Done = trailing; support swipe-to-dismiss (confirm if unsaved changes). **One sheet at a time.** Complex/long flow → full-screen modal instead.41- **Popover** — transient, arrow points at the triggering control; **avoid in compact (iPhone) width — use a sheet**; never use a popover for a warning (use an alert).42- **Alert** — critical, time-sensitive, ideally actionable; ≤3 buttons. **Use sparingly**; *"avoid using an alert merely to provide information"*; don't alert on common undoable destructive actions; never alert at launch. Default/most-likely button trailing/top, Cancel leading/bottom; destructive style only when the user *didn't* deliberately choose it; always include Cancel with a destructive action; never make Cancel default.43- **Action sheet** (`confirmationDialog`) — choices tied to an **intentional** action. Cancel at the bottom; destructive choices prominent at the top. Use this — not an alert — for choices on a user-initiated action.44- **Modality** — present modally only with a clear benefit; keep modal tasks short; always give an obvious dismissal; confirm before closing if content would be lost; **one modal at a time** (an alert may appear above another modal).4546## Status47- **Progress:** prefer **determinate** when duration is known; report accurately, keep it moving; *"don't switch from the circular style to the bar style."* iOS pull-to-refresh control optional.48- **Gauge:** single value in a range (standard = indicator, capacity = fill); succinct value + endpoint labels for VoiceOver.4950## Greg application51- Bottom **tab bar** for the 3–5 top sections (filled symbols); **toolbar** `+` for actions, not navigation.52- "Log food" flows open as a **sheet** at `.medium` (progressive disclosure), draggable to `.large`.53- Allergy/irreversible confirmations: **action sheet** with destructive-styled choice on intentional actions; reserve **alerts** for true safety stops.54- Profile/targets editing: **inset-grouped list**; switches only in rows; numeric entry with a stepper+field and the right keyboard type.55- One prominent (tangerine) primary button per screen; everything else secondary/plain.5657Pairs with: `ios-liquid-glass-swiftui`, `ios-flows-and-patterns` (modality/feedback), `ios26-hig-patterns`.