Discover how to implement VoiceOver, Apple's built-in screen reader that enables blind and low-vision users to interact with iOS devices. If your app doesn't support it, these users simply cannot use your product. We perform a comprehensive audit and implement VoiceOver end-to-end, ensuring compliance with accessibility standards. Our team has over 10 years of experience and has completed 50+ successful accessibility projects. Guaranteed WCAG 2.1 compliance. Contact us for an assessment of your app.
Why VoiceOver Matters for Business
According to Apple, over 1 billion people worldwide have disabilities, and 70% of iOS users with disabilities actively use VoiceOver. Ignoring this audience means losing a substantial portion of potential customers. Moreover, many government, healthcare, and education contracts require WCAG 2.1 or Section 508 compliance. Apps without VoiceOver fail these requirements, limiting market reach. Non-compliance can also lead to legal penalties and fines. Automated auditing is 5 times more efficient than manual testing in terms of speed, and fixing issues during development costs 3–5 times less than after release. Investing in accessibility can save up to $10,000 annually in potential legal fees and lost customers.
Which App Elements Break Without VoiceOver?
Custom UIView and SwiftUI Views
Standard UIButton, UILabel, UITextField — VoiceOver understands them out of the box. Custom UIView with content drawn on CALayer — not. VoiceOver sees the entire custom view as a single element with no description.
For UIKit: isAccessibilityElement = true, accessibilityLabel, accessibilityHint, accessibilityTraits. accessibilityLabel describes what it is (e.g., "Add to cart button"). accessibilityHint explains what happens on activation (e.g., "Adds the item to your cart and proceeds to checkout"). accessibilityTraits define the element type (.button, .link, .image, .header, .selected).
| Aspect | UIKit | SwiftUI |
|---|---|---|
| Label | accessibilityLabel |
.accessibilityLabel() |
| Hint | accessibilityHint |
.accessibilityHint() |
| Traits | accessibilityTraits |
.accessibilityAddTraits() |
| Combine children | Array accessibilityElements |
.accessibilityElement(children: .combine) |
For SwiftUI accessibility: use modifiers .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(). To combine multiple nested views into one accessible element — .accessibilityElement(children: .combine) or .accessibilityElement(children: .ignore) with explicit label.
Images Without Alt Text
UIImageView with isAccessibilityElement = false (default) — VoiceOver skips it. That's correct for decorative images. But for meaningful images, an accessibilityLabel is needed. Icon-only buttons: if a UIButton contains only a UIImageView without text, set an accessibilityLabel on the button; otherwise, VoiceOver reads the filename or says nothing.
Focus Order
VoiceOver traverses elements based on accessibilityActivationPoint — typically the center of the frame. For complex layouts (overlays, absolute positioning in SwiftUI, custom containers), the order can be chaotic. Fix via accessibilityElements on the parent container — an array in the desired order:
override var accessibilityElements: [Any]? { get { [titleLabel, priceLabel, addButton] } set { } } In SwiftUI, use .accessibilitySortPriority() to control order.
Modal Screens and Custom Overlays
UIAlertController — VoiceOver focuses automatically. A custom UIView overlay on top of content — not. You need UIAccessibility.post(notification: .screenChanged, argument: firstElement) to move focus to the overlay's first element. On dismissal, post(notification: .screenChanged, argument: triggerButton) to return focus to the button that opened the overlay.
Set accessibilityViewIsModal = true on the overlay container to hide background content from VoiceOver. Without it, users can swipe through the overlay to the background content.
How We Conduct Audit and Implementation: Step-by-Step Process
- Enable VoiceOver — Cmd+F5 in Simulator or triple-click Home/Side Button on device. VoiceOver setup is the first step. Walk through all key flows: onboarding, main screen, primary actions (place order, send message, play media).
- Log issues — elements without labels, wrong focus order, unreachable elements, modal overlays lacking focus management.
- Tools — Accessibility Inspector (Xcode) checks contrast, finds elements without labels without running the app. XCTest with
XCUIAccessibilityAudit(iOS 17+) provides automated auditing in UI tests. - Prioritize fixes — first navigation and key CTAs, then lists and forms, then media content.
Comparison of manual and automated testing:
| Criterion | Manual Testing | Automated Audit |
|---|---|---|
| Time per screen | 10–15 min | 1–2 min |
| Coverage | Selective | Full (all elements) |
| Accuracy | Depends on tester | Consistent |
| Repeatability | Low | High (can run in CI) |
What's Included in the Work
- Accessibility audit with a report for each screen and priority of fixes.
- Implementation of accessibility labels, hints, and traits for all custom components.
- Focus order configuration for complex layouts and modal windows.
- Integration with VoiceOver for dynamic content (e.g., updates after loading).
- Testing with Accessibility Inspector and manual verification of key scenarios.
- Documentation and recommendations for the team to maintain accessibility in future updates.
- 30-day support guarantee after implementation.
Timeline: 3–5 days for a medium-scale app. Cost is determined individually — typical implementation for a medium app ranges from $2,000 to $5,000; audit-only starts at $1,000. Contact us, and we'll assess your project. Get a consultation for your project — we'll help implement VoiceOver quality. With proper app adaptation for accessibility, you can reach millions more users. Interface accessibility improvements not only help disabled users but also enhance overall user experience.
Common VoiceOver Implementation Mistakes
- Forgetting to set
accessibilityLabelfor icon-only buttons (only images). - Not using
accessibilityTraits, causing VoiceOver to not distinguish a button from static text. - Ignoring Dynamic Type — fonts don't scale, text gets truncated.
- Neglecting focus order on screens with custom animations or overlays.
By avoiding these mistakes, you make your app accessible to millions of users. For VoiceOver iOS implementation, we ensure full compatibility with WCAG 2.1 for iOS.







