Switch Control scanning

Status: draft

When to use this guide

Touch works, and nobody knows how the screen behaves with Switch Control: how many steps it takes to reach the main button, whether scanning gets stuck in a list, whether secondary actions are reachable.

Switch Control scanning contract
The diagram defines the contract: meaningful groups, a short scanning path, safe selection, and available secondary actions.

How it works

Switch Control highlights items one after another. The user selects the highlighted item with a switch, which can be an external switch, a tap on the screen, a head movement seen by the camera, or a sound. Every extra stop is another wait or another press. A card with 6 stops in a list of 20 is 120 stops.

Selecting an item opens the scanner menu, with Tap and, if the element has them, its custom actions.

The rule

Verdict: one stop per object, with secondary actions as custom actions. Primary and frequent actions stay separate buttons. Destructive actions have a confirmation.

Why: fewer stops is less time and fewer presses. Custom actions keep secondary actions reachable from the scanner menu without adding a stop to every card.

Implementation

SwiftUI:

OrderCard(order)
    .accessibilityElement(children: .combine)
    .accessibilityAction(named: "Cancel order") { confirmCancel(order) }

UIKit:

cell.isAccessibilityElement = true
cell.accessibilityLabel = "Order 1042, Delivered, $24.80"
cell.accessibilityTraits = .button
cell.accessibilityCustomActions = [
    UIAccessibilityCustomAction(name: "Cancel order") { [weak self] _ in
        self?.confirmCancel(order)
        return true
    }
]

Before:

Order 1042
8 Garden Street
$24.80
Delivered
Cancel
Reorder

6 stops per card.

After:

Order 1042, Delivered, $24.80, button
Reorder order 1042, button

2 stops per card, with "Cancel order" in the scanner menu.

What we don't do

  • We don't combine the whole screen into one element. Fewer stops, nothing reachable.
  • We don't put a primary action only in custom actions.
  • We don't put a destructive action next to a frequent one without a confirmation. A late press lands on the next item.

Check

Profile:   Switch Control, auto scanning
Task:      reorder order 1042
Expected:  done without touching the screen
           the number of stops to the button is written down
           "Cancel order" is in the scanner menu and asks for confirmation

Write down the stop count. Accessibility Inspector shows whether a card is one element, but not how long scanning takes.

Task:               cancel order
Profile:            Switch Control
Stops before fix:   18
Stops after fix:    5
Remaining risk:     none, confirmation added

The audit catches hit regions and missing names on the same screen:

try app.performAccessibilityAudit(for: [.hitRegion, .sufficientElementDescription])

Grouping on design system cards is easy to break. A snapshot of the accessibility tree catches a card that splits back into 6 elements. Accessibility testing toolkit.

Check VoiceOver and Voice Control on the same screen. Grouping that's too broad hides details from VoiceOver and names from Voice Control.

Chapter 3, Chapter 7, Chapter 13, Swipe Trap, Over Grouped Control, Right Sized Grouping, Accessible Card, Gesture Alternative, Accessibility testing toolkit.

Sources

Apple Support: Set up and turn on Switch Control, Apple Support: Use Switch Control to select items, Apple Developer: UIAccessibilityCustomAction, Apple Developer: Performing accessibility audits for your app.