Install any skill in seconds. Free to start, no credit card required.
Get Started Free →iPhone-specific Apple Human Interface Guidelines for iOS 26 (Liquid Glass) — the floating tab bar and how content scrolls under it, navigation/sheets/presentation detents, SF Symbols + Dynamic Type + safe areas, control styles, 44pt touch targets, and the concrete SwiftUI modifiers that implement each. Use when building or reviewing any native iPhone screen; pairs with platform-conventions (cross-platform) and components-and-states.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 83% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 88% | 0% |
platform-conventions covers cross-platform norms and design-system-frameworks covers HIG's philosophy (deference, clarity, depth). This skill is the iPhone-on-iOS-26 field manual: the specific behaviors and SwiftUI modifiers that make a screen feel native instead of like a ported web app. iOS 26's design language is Liquid Glass — translucent, layered surfaces that refract the content behind them; the system chrome (tab bar, toolbars, sheets) floats over content rather than boxing it in.
The single most common iOS-26 mistake: forcing system chrome opaque to "match the brand." That fights the platform, breaks content-scrolls-under behavior, and reserves dead insets (the classic "white bar above the tab bar"). Default to letting the system render its chrome; theme only tint and your own surfaces.
> This is the field-manual overview. For depth, use the specialized suite, each grounded in Apple HIG/WWDC25 sources: ios-liquid-glass-swiftui (material + verified API table), ios-typography, ios-layout-and-grid, ios-color-and-materials, ios-sf-symbols-and-icons, ios-components, ios-flows-and-patterns.
On iOS 26 a TabView renders as a floating, translucent pill inset from the screen edges. Content is expected to scroll underneath it; the system adds a bottom content inset so the last item can clear the bar at rest.
ScrollView/List inside a tab automatically gets the correct bottom inset and content refracts through the glass as it scrolls.swift // ANTI-PATTERN — reserves a large opaque inset, content can't scroll under, dead "white bar". UITabBar.appearance().standardAppearance = opaqueWhiteAppearance .toolbarBackground(.visible, for: .tabBar) Removing both restores native behavior. Only set an opaque background if a specific screen genuinely needs it, and then expect the inset.
.tint(brandColor) on the TabView, not by overriding the bar's material.Label(text, systemImage:). More than 5 collapses into "More" — avoid..tabBarMinimizeBehavior(.onScrollDown) (iOS 26) lets the bar shrink as the user scrolls a long page — use it on content-heavy tabs to reclaim space instead of fighting the inset.NavigationStack (not the deprecated NavigationView). Large title by default; it collapses to inline on scroll — this is good, keep it..navigationBarTitleDisplayMode(.inline)) on dense utility screens where a large title wastes the first 60pt..toolbar { ToolbarItem(placement: .topBarTrailing) { … } }. On iOS 26 toolbars are also Liquid Glass and float — don't background them opaque either. Standard items get corner radii concentric with the bar; use .prominent for the one primary action (trailing)..scrollEdgeEffectStyle(.hard, for: .top) on dense top bars; it's functional, not decorative, one per view. Don't replace it with a hard opaque bar background.Modeless, partial sheets are the iOS-native way to add detail without a full push.
.sheet(isPresented:) + .presentationDetents([.medium, .large]) — start at .medium for a quick action (log food, edit a value), let the user drag to .large..presentationDragIndicator(.visible) for discoverability..presentationBackgroundInteraction(.enabled(upThrough: .medium)) when the user should still see/scroll the screen behind..symbolRenderingMode(.hierarchical) for depth, .palette for two-tone brand accents..symbolEffect(.bounce) / .pulse for state changes (logged ✓, syncing) — subtle, not decorative..font(.body), .headline, .caption) so text scales with the user's setting. If you hardcode sizes, gate the largest accessibility sizes and test at AX5..dynamicTypeSize(...DynamicTypeSize.accessibility3) to cap on a layout that genuinely can't grow further — but prefer reflowing.@Environment(\.colorScheme). Hit WCAG AA (4.5:1 text). The HIG's "increase contrast" and "reduce transparency" accessibility settings should still leave Liquid Glass legible — test with Reduce Transparency on..safeAreaInset(edge:) to add a pinned footer that the system insets correctly, instead of manual bottom padding..safeAreaPadding over raw .padding when the intent is "clear the system chrome."@Environment(\.accessibilityReduceMotion) — drop parallax/large transitions when set.Button(role: .destructive), .confirmationDialog for destructive choices, Toggle, Stepper, Picker (menu/segmented/wheel), Slider. Native controls inherit Liquid Glass, Dynamic Type, VoiceOver, and haptics for free.Picker(.segmented) is the canonical way to switch a screen's view without a new push or scroll — central to dense layouts..buttonStyle(.borderedProminent) for the single primary action; .bordered/.plain for secondary. One prominent action per screen region..sensoryFeedback(.success, trigger:) on confirmations, .selection on segmented/stepper changes.NavigationStack, large title that collapses; inline title on dense screens..medium detent sheet, not a full push.Other measured skills in the registry, with their headline benchmark lift.