This one's for when you're building iOS apps that need to work with VoiceOver, Dynamic Type, Switch Control, and other assistive technologies. It covers both UIKit and SwiftUI implementations with a pragmatic approach: accessibility from the start, not as an afterthought. The guidance is opinionated in good ways, like avoiding "Close button" labels (VoiceOver already says "button") and preferring native components over custom builds. It includes decision trees for common scenarios, anti-patterns to dodge, and manual testing workflows alongside code fixes. The agent won't just throw fixes at you without considering actual user impact across different assistive technologies.
npx -y skills add dadederk/ios-accessibility-agent-skill --skill ios-accessibility --agent claude-codeInstalls into .claude/skills of the current project.
This skill provides expert guidance on iOS accessibility, covering VoiceOver, Dynamic Type, assistive technologies, inclusive design practices, and both UIKit and SwiftUI implementations. Use this skill to help developers build apps that work for everyone.
.accessibilityHidden(true) on interactive elements — Users won't be able to access them.label, .secondaryLabel) for contrast and Dark ModeisAccessibilityElement = true, set accessibilityLabel (and value/traits as needed)..accessibilityElement(children: .ignore) is used, provide label/value/traits manually.onTapGesture alone — Prefer semantic controls like Button. If gesture handling is unavoidable, add button traits and clear labels..accessibilityShowsLargeContentViewer / UILargeContentViewerItem.Prefer native components: Whenever possible, use Apple's native components and customize them to your needs instead of building custom components from scratch.
Design system first: Whenever the project uses a design system of its own (colors, text styles, component catalog), propose changes in the design system itself so the improvement snowballs everywhere in the app using an improved component.
Platform parity: The same accessibility principles apply to both UIKit and SwiftUI, but APIs and implementation details differ.
Before providing accessibility guidance, determine:
UILargeContentViewerInteraction), SF SymbolsUIAccessibilityCustomAction.init(name:image:actionHandler:))AccessibilityFocusState, .accessibilityRotor.accessibilityRepresentation, .accessibilityActions { } syntax.sensoryFeedback#available checks and deployment target in project settings.label, .systemBackground) and text styles (.preferredFont(forTextStyle:) in UIKit, .font(.body) in SwiftUI) vs hardcoded values?.accessibilityLabel, .accessibilityTraits, etc. to match project style.If you can't determine the above, ask the developer to confirm before giving version-specific or framework-specific guidance.
When a developer needs accessibility guidance, follow this decision tree:
VoiceOver issues?
references/voiceover.mdreferences/voiceover-uikit.mdreferences/voiceover-swiftui.mdDynamic Type, text scaling, or adaptive layout?
references/dynamic-type.mdreferences/dynamic-type-uikit.mdreferences/dynamic-type-swiftui.mdOther assistive technologies?
references/voice-control.mdreferences/switch-control.mdreferences/full-keyboard-access.mdTesting accessibility?
references/testing-manual.mdreferences/testing-automated.mdCross-cutting concerns?
references/good-practices.mdreferences/concepts-and-culture.mdQuick reference needed?
references/playbook.mdNeed definitions or sources?
references/glossary.mdreferences/resources.mdFor common mistakes, inspector warnings, code patterns, version-specific APIs, and checklists, use references/playbook.md.
Example prompt: “VoiceOver reads ‘button’ for my close button.” Expected response:
Example prompt: “Dynamic Type breaks my header layout in UIKit.” Expected response:
preferredContentSizeCategory handling and iOS target.sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot