agentleFS
fal3fal3/claude-skills-collection/skills/ios-accessibility-skill/SKILL.md

iOS Accessibility Skill

Skill18 starsChanged 57 days agoMITView on GitHub

Use when iOS or iPadOS accessibility design, implementation, review, or testing involves VoiceOver, Voice Control, Switch Control, Full Keyboard Access, Dynamic Type, contrast, motion, focus, media alternatives, or Assistive Access. Do not use for generic visual styling or platform-neutral UI work with no accessibility requirement.

The file

Show its rules and text

We split this skill into the rules it gives an agent

24 rules. About 0 are common, 19 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈19

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Treat accessibility as part of the product contract, not a modifier pass at the end.

    line 8
  2. Distinctive:

    Always check the user's deployment target before emitting newer API code.

    line 19
  3. Distinctive:

    Test every Dynamic Type size, including accessibility categories.

    line 26
  4. Distinctive:

    Test Increase Contrast, Reduce Motion, Reduce Transparency, Differentiate Without Color, Bold Text, and button shapes.

    line 27
  5. Distinctive:

    Verify localization, right-to-left layouts, captions/transcripts, and audio descriptions where applicable.

    line 28
  6. Distinctive:

    Run Accessibility Inspector, then test on device and with disabled users when possible.

    line 29
  7. Very specific:

    Prefer semantic controls such as Button, Toggle, TextField, Slider, and Link over tap gestures on generic views.

    line 35
  8. Distinctive:

    Do not put gestures in hints: avoid “Tap,” “Double-tap,” or “Swipe.” VoiceOver already teaches interaction mechanics.

    line 37
  9. Distinctive:

    Do not repeat the control type in its label.

    line 38
  10. Distinctive:

    Add custom actions or rotors when they shorten a real workflow.

    line 40
  11. Very specific:

    Use .combine for static fragments that should form one announcement, such as a title plus subtitle.

    line 46
  12. Very specific:

    Use .contain to create a navigable group while preserving its interactive children.

    line 47
  13. Distinctive:

    Never combine multiple text fields, buttons, or other independently actionable controls into one accessibility element.

    line 48
  14. Distinctive:

    Keep focus order aligned with visual and task order.

    line 49
  15. Distinctive:

    Prefer state-driven updates.

    line 50
  16. Very specific:

    Prefer semantic fonts such as .body, .headline, and .title.

    line 76
  17. Very specific:

    Use @ScaledMetric(relativeTo:) for icons, spacing, or custom controls that should grow with a text style.

    line 79
  18. Distinctive:

    Prefer the platform's standard control sizes.

    line 86
  19. Distinctive:

    Do not require precision, simultaneous gestures, long holds, or motion when a simpler alternative can perform the same task.

    line 87
  20. Distinctive:

    Ensure Switch Control scanning reaches every task and that custom controls expose adjustable or custom actions.

    line 89
  21. Distinctive:

    Never encode status using color alone.

    line 94
  22. Distinctive:

    Check contrast in every state and appearance, including disabled and selected states.

    line 95
  23. Distinctive:

    Keep pathways short, labels literal, decisions limited, and destructive operations recoverable.

    line 103
  24. Distinctive:

    Every recommendation must state relevant availability and include a fallback when the deployment target predates the API.

    line 114

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

iOS Accessibility Skill

Treat accessibility as part of the product contract, not a modifier pass at the end. Preserve the semantics of native controls, support user settings, and verify behavior with the actual assistive technologies in scope.

Baseline and availability

Core guidance applies broadly. Copy-ready examples use Xcode 15, Swift 5.9, and iOS/iPadOS 17.

  • Assistive Access exists as a system experience on iOS/iPadOS 17.
  • accessibilityAssistiveAccessEnabled is available from iOS/iPadOS 18.
  • The SwiftUI AssistiveAccess scene and assistiveAccessNavigationIcon are stable Xcode 26 APIs requiring iOS/iPadOS 26.
  • OS 27-cycle material is beta relative to stable Xcode 26.6. Include it only on explicit request, label it beta, and gate it.

Always check the user's deployment target before emitting newer API code.

Audit order

  1. Identify essential tasks, content, and destructive actions.
  2. Inspect the accessibility tree: roles, labels, values, hints, ordering, grouping, and hidden decoration.
  3. Exercise VoiceOver, Voice Control, Switch Control, and Full Keyboard Access as relevant.
  4. Test every Dynamic Type size, including accessibility categories.
  5. Test Increase Contrast, Reduce Motion, Reduce Transparency, Differentiate Without Color, Bold Text, and button shapes.
  6. Verify localization, right-to-left layouts, captions/transcripts, and audio descriptions where applicable.
  7. Run Accessibility Inspector, then test on device and with disabled users when possible.

Automated checks can find omissions; they cannot prove that reading order, wording, focus, and task flow are usable.

Semantics

  • Prefer semantic controls such as Button, Toggle, TextField, Slider, and Link over tap gestures on generic views.
  • Labels identify an element or action concisely. Values communicate current state. Hints describe the result when that result is not obvious.
  • Do not put gestures in hints: avoid “Tap,” “Double-tap,” or “Swipe.” VoiceOver already teaches interaction mechanics.
  • Do not repeat the control type in its label; the accessibility trait supplies it.
  • Hide purely decorative images. For icon-only buttons, label the button rather than exposing the image separately.
  • Add custom actions or rotors when they shorten a real workflow; retain an ordinary visible path to the action.

See the complete favorite-button example. A hint such as “Adds this item to Favorites” describes the result; omit it when the label already makes that result clear.

Grouping and focus

  • Use .combine for static fragments that should form one announcement, such as a title plus subtitle.
  • Use .contain to create a navigable group while preserving its interactive children.
  • Never combine multiple text fields, buttons, or other independently actionable controls into one accessibility element.
  • Keep focus order aligned with visual and task order. Restore focus deliberately after modal transitions or major content replacement.
  • Prefer state-driven updates. Post announcements only when important information would otherwise be missed; avoid interrupting speech for routine changes.
import SwiftUI

struct ContactForm: View {
    @State private var name = ""
    @State private var phone = ""

    var body: some View {
        VStack(alignment: .leading) {
            Text("Contact information")
                .font(.headline)
                .accessibilityAddTraits(.isHeader)
            TextField("Name", text: $name)
            TextField("Phone", text: $phone)
        }
        .accessibilityElement(children: .contain)
    }
}

Each field remains independently editable and focusable.

Dynamic Type

  • Prefer semantic fonts such as .body, .headline, and .title.
  • For a custom face, use Font.custom(_:size:relativeTo:) in SwiftUI or UIFontMetrics in UIKit.
  • Let user content wrap. Avoid fixed heights, single-line limits, and minimumScaleFactor as substitutes for layout that supports large text.
  • Use @ScaledMetric(relativeTo:) for icons, spacing, or custom controls that should grow with a text style.
  • At accessibility sizes, switch layout when needed—for example, place trailing actions below labels instead of squeezing them horizontally.

See the Dynamic Type example.

Motor and input accessibility

  • Prefer the platform's standard control sizes. On iOS/iPadOS, aim for the default 44-by-44-point target. If a compact design uses the documented 28-by-28-point minimum, provide sufficient spacing and verify it with real input.
  • Do not require precision, simultaneous gestures, long holds, or motion when a simpler alternative can perform the same task.
  • Give Voice Control users unique, visible names and avoid duplicate control labels.
  • Ensure Switch Control scanning reaches every task and that custom controls expose adjustable or custom actions.
  • Support keyboard focus, activation, dismissal, and visible focus indication on iPad when Full Keyboard Access is relevant.

Visual, motion, and media access

  • Never encode status using color alone; pair it with text, shape, or an icon.
  • Check contrast in every state and appearance, including disabled and selected states.
  • Honor accessibilityReduceMotion, accessibilityReduceTransparency, accessibilityDifferentiateWithoutColor, and colorSchemeContrast.
  • Replace large motion or parallax with a meaningful low-motion transition; do not merely shorten a hazardous animation.
  • Caption speech and meaningful sounds in video, provide transcripts for audio, and add audio descriptions when visuals carry essential information.
  • Localize accessibility strings in context. Keep private values out of labels, announcements, logs, and screenshots.

Cognitive accessibility and Assistive Access

  • Keep pathways short, labels literal, decisions limited, and destructive operations recoverable.
  • Pair symbols with clear text and keep navigation consistent.
  • For iOS 26+, consider a dedicated AssistiveAccess scene only when the app benefits from a distilled experience. Add the required Info.plist support and test the entire scene on device.
  • On iOS 18+, accessibilityAssistiveAccessEnabled can adapt an existing view, but it is not a substitute for designing the simplified flow.

Copy-ready examples

  • Semantic VoiceOver button
  • Dynamic Type layout
  • Accessibility review prompts

Every recommendation must state relevant availability and include a fallback when the deployment target predates the API.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.