Use when you need to review iOS interfaces against platform conventions, navigation, accessibility, and touch ergonomics.
How this skill is triggered — by the user, by Claude, or both
Slash command
/skillry-mobile-desktop:26-ios-hig-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Audit an iOS interface (UIKit or SwiftUI) against Apple's Human Interface Guidelines: safe-area layout, Dynamic Type, SF Symbols usage, haptic feedback, dark mode, tap-target sizing, navigation paradigm, and VoiceOver support. The output is a prioritized set of findings, each citing the relevant HIG area and a concrete code fix, ranked by App Store submission risk. The review reads source or sc...
Audit an iOS interface (UIKit or SwiftUI) against Apple's Human Interface Guidelines: safe-area layout, Dynamic Type, SF Symbols usage, haptic feedback, dark mode, tap-target sizing, navigation paradigm, and VoiceOver support. The output is a prioritized set of findings, each citing the relevant HIG area and a concrete code fix, ranked by App Store submission risk. The review reads source or screenshots only and never triggers Xcode builds or TestFlight uploads.
android-material-review.mobile-app-review..safeAreaInset, safeAreaLayoutGuide, or .ignoresSafeArea usage is intentional. Content under the notch, Dynamic Island, or home indicator must be deliberate and remain readable..font(.body) or .font(.headline) in SwiftUI, or UIFont.preferredFont(forTextStyle:) in UIKit, or a custom font via relativeTo:. Confirm labels do not truncate at accessibility sizes; use .fixedSize(horizontal: false, vertical: true) where needed..frame(minWidth: 44, minHeight: 44) or add .contentShape(Rectangle()) to extend the hit area..symbolRenderingMode and .foregroundStyle over tint hacks; multicolor symbols need .renderingMode(.original); tab-bar symbols need the .fill variant.UIImpactFeedbackGenerator and UINotificationFeedbackGenerator (or SwiftUI .sensoryFeedback) should mark meaningful state changes, not decorate animations. Call .prepare() before .impactOccurred() to avoid first-fire latency.UIColor(red:...) and Color(red:...) with semantic colors (Color(.systemBackground), .label, .secondaryLabel). Confirm asset-catalog images have dark variants.NavigationStack (iOS 16 and later) instead of the deprecated NavigationView. Modal sheets are for self-contained tasks, not drill-down. The back-button label should reflect the parent title, not a generic "Back"..sheet, .fullScreenCover, and .presentationDetents are appropriate; destructive actions in a sheet require explicit confirmation..accessibilityLabel, .accessibilityHint, and .accessibilityValue on custom controls; mark decorative images .accessibilityHidden(true); verify UIAccessibility.isReduceMotionEnabled is respected for non-essential animation.Layout and type:
Touch and symbols:
.fill variant.Color and motion:
.prepare() first.Navigation and accessibility:
NavigationStack is used on iOS 16 and later; modals are for tasks, not drill-down.Info.plist privacy usage strings are present and accurate.# --- Dynamic Type ---
# hardcoded fonts that break Dynamic Type
rg -n 'Font.system\(size:|UIFont.systemFont\(ofSize:|\.font\(.system\(size:' .
# --- dark mode ---
# hardcoded colors that break dark mode
rg -n 'UIColor\(red:|Color\(red:|UIColor\(white:|#[0-9a-fA-F]{6}' .
# --- navigation ---
# deprecated NavigationView (should be NavigationStack on iOS 16+)
rg -n 'NavigationView\b' .
# custom back buttons that may drop the parent title
rg -n 'navigationBarBackButtonHidden|\.backButtonTitle' .
# --- SF Symbols / tap targets ---
# small icon-only buttons — verify 44pt hit area nearby
rg -n 'Image\(systemName:' . | head -40
# tab-bar symbols missing the fill variant
rg -n 'TabItem|tabItem' . | head
# --- haptics ---
# haptic generators and whether prepare() is called
rg -n 'FeedbackGenerator|impactOccurred|sensoryFeedback|\.prepare\(\)' . | head
# --- accessibility ---
# accessibility annotations present on custom controls?
rg -n 'accessibilityLabel|accessibilityHint|accessibilityHidden' . | head
# Reduce Motion respected?
rg -n 'isReduceMotionEnabled|accessibilityReduceMotion' .
# --- privacy ---
# Info.plist privacy usage strings
rg -n 'NSCameraUsageDescription|NSMicrophoneUsageDescription|NSLocationWhenInUseUsageDescription' .
# --- sheets / presentation ---
# sheet, full-screen cover, and detents usage
rg -n '\.sheet|fullScreenCover|presentationDetents' . | head
# --- alerts ---
# UIKit alerts presented from SwiftUI (sheet-stacking bug on iOS 17+)
rg -n 'UIAlertController|keyWindow' . | head
# --- truncation at large sizes ---
# labels that may truncate under accessibility Dynamic Type sizes
rg -n 'lineLimit\(|truncationMode|fixedSize' . | head
.ignoresSafeArea() on a scroll view hides content under the Dynamic Island on iPhone 14 Pro and later.Font.system(size: 14) does not scale with Dynamic Type — use .body, .caption, .footnote, or relativeTo:.UIAlertController via UIApplication.shared.keyWindow breaks sheet stacking on iOS 17 and later. Use the .alert modifier..symbolVariant: Image(systemName: "heart") in a tab bar without .fill violates tab-bar conventions.Color(.widgetBackground) and .widgetAccentable() are used.cellForRowAt causes scroll jank — load asynchronously..sheet to push a detail screen that should be a NavigationStack destination, so the back gesture and title behavior feel wrong.Color(red:...) instead of an asset-catalog color set, so it ignores both dark mode and high-contrast accessibility settings.Return a structured report with:
Info.plist privacy strings without listing every change explicitly for the user to review.Done means the framework and deployment target are identified; safe area, Dynamic Type, tap targets, SF Symbols, haptics, dark mode, navigation, and VoiceOver were each checked against HIG; every finding cites a HIG area and a concrete fix; and the top three submission blockers are called out with a VoiceOver and Dynamic Type pass/fail summary.
npx claudepluginhub fluxonlab/skillry --plugin skillry-mobile-desktopCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.