UX Design

Accessible Mobile App Design: iOS and Android

By EZUD Published · Updated

Accessible Mobile App Design: iOS and Android

Mobile apps face every accessibility challenge web products do, plus platform-specific constraints: gestures replace keyboard shortcuts, screen real estate is limited, and assistive technology (VoiceOver on iOS, TalkBack on Android) interacts with native UI frameworks differently than with web content. Building accessible mobile apps requires understanding both WCAG principles and platform-specific accessibility APIs.

Platform Accessibility Frameworks

iOS (VoiceOver)

VoiceOver is Apple’s built-in screen reader. It uses swipe gestures for navigation and a rotor control for switching between navigation modes (headings, links, form controls).

Key iOS accessibility APIs:

  • accessibilityLabel: The text VoiceOver reads for the element. Every interactive element needs one.
  • accessibilityHint: Additional context describing the result of an action (“Double-tap to add to cart”).
  • accessibilityTraits: Defines the element’s role (button, link, header, adjustable). Maps to ARIA roles conceptually.
  • accessibilityValue: The current value for adjustable controls (sliders, steppers).
  • isAccessibilityElement: Whether VoiceOver should recognize the element. Container views should be false; their children should be true.

Android (TalkBack)

TalkBack is Android’s primary screen reader. It uses swipe gestures and explore-by-touch for navigation.

Key Android accessibility APIs:

  • contentDescription: The text TalkBack reads. Equivalent to iOS accessibilityLabel.
  • importantForAccessibility: Controls whether the view is visible to TalkBack.
  • AccessibilityNodeInfo: Programmatic access to an element’s role, state, and actions.
  • ViewCompat.setAccessibilityDelegate(): Custom accessibility behavior for complex views.
  • Live regions: ViewCompat.setAccessibilityLiveRegion() for dynamic content announcements, equivalent to aria-live on the web.

Cross-Platform Accessibility Principles

1. Label Every Interactive Element

The most common mobile accessibility failure: buttons, icons, and controls with no accessible label. An icon-only trash button without a content description is announced as “button” by both VoiceOver and TalkBack — useless.

Every interactive element needs:

  • A label describing what it is or does.
  • A role (button, link, checkbox, slider) provided by native UI components or explicitly set.
  • A state (selected, expanded, disabled) that updates dynamically.

2. Touch Target Sizing

Both platforms recommend minimum touch targets well above WCAG’s 24px:

  • iOS: 44x44 points minimum.
  • Android (Material Design): 48x48 dp minimum.

Apply the same principles as our touch target sizing guide: pad small icons to expand the interactive area and space adjacent targets apart.

3. Gesture Alternatives

Mobile interactions rely on gestures that may be impossible for users with motor impairments:

GestureAccessibility ConcernAlternative Needed
Swipe to deleteRequires precise directional swipeEdit mode with delete button
Pinch to zoomRequires two fingersZoom buttons or double-tap
Long pressRequires sustained contactMenu button or action sheet
Custom gesturesNot discoverable, not universalStandard UI controls
Drag to reorderRequires sustained contact + movementMove up/move down buttons

WCAG 2.2 SC 2.5.1 (Pointer Gestures, Level A) requires that any function using multipoint or path-based gestures can be operated with a single pointer without a path-based gesture. SC 2.5.7 (Dragging Movements, Level AA) requires alternatives to drag operations. See our accessible drag and drop guide.

4. Dynamic Content Announcements

When content updates without navigation (a toast notification, a counter incrementing, a loading state resolving), assistive technology must be informed:

  • iOS: Use UIAccessibility.post(notification: .announcement, argument: "Item added to cart").
  • Android: Use announceForAccessibility("Item added to cart") or set a live region on the updating view.

5. Navigation and Focus Order

Both VoiceOver and TalkBack traverse the screen in a logical order (top-left to bottom-right for LTR, reversed for RTL). Custom layouts must ensure this order matches the intended reading order.

  • Group related elements into accessibility containers so the screen reader treats them as a unit.
  • When a modal or bottom sheet appears, trap focus within it.
  • When the modal dismisses, return focus to the trigger element. Same principles as web focus management.

6. Text and Typography

  • Respect the system font size preference (Dynamic Type on iOS, font scale on Android). Hard-coded font sizes ignore user preferences.
  • Apply the same typography principles as web: 16pt minimum body text, sufficient line height, adequate contrast.
  • Avoid text truncation without providing access to the full content.

Testing Mobile Accessibility

TestiOSAndroid
Screen reader navigationVoiceOver (triple-click home/side button)TalkBack (Settings > Accessibility)
Keyboard navigationConnect Bluetooth keyboardConnect Bluetooth keyboard
Switch controlSwitch Control (Settings > Accessibility)Switch Access (Settings > Accessibility)
Display settingsBold Text, Larger Text, Increase Contrast, Reduce MotionFont size, Display size, High contrast text
Automated auditXcode Accessibility InspectorAndroid Studio Accessibility Scanner

Test with at least one screen reader on each target platform. Use the platform’s accessibility inspector during development.

Key Takeaways

  • Every interactive element needs an accessible label, role, and state on both iOS and Android.
  • Touch targets: 44x44 points (iOS) or 48x48 dp (Android) minimum.
  • Provide alternatives for all custom gestures — swipe, pinch, long press, and drag.
  • Announce dynamic content updates using platform-specific live region APIs.
  • Respect system font size preferences; never hard-code text sizes.

Next Steps

Sources

iOS accessibility guidance from Apple’s Human Interface Guidelines and VoiceOver documentation. Android accessibility guidance from Material Design 3 and Android Accessibility developer documentation. WCAG requirements from Success Criteria 2.5.1 and 2.5.7.