Skip to content

VoiceOver

Keeping Score! is fully usable with VoiceOver, Apple’s built-in screen reader.

Every interactive element in the app has an explicit accessibility label. VoiceOver reads these labels aloud as you navigate, giving you full control without seeing the screen.

Player rows in the gameplay view use .accessibilityElement(children: .combine) so VoiceOver reads them as a single element:

“Alice, rank 1, 42 points”

Gameplay rows also include a hint — “Double tap to open calculator” — so the calculator entry point is discoverable.

Calculator buttons carry the .isKeyboardKey trait, matching Apple’s built-in Calculator app. This means:

  • Keys are announced by their label (e.g., “7”, “plus”, “equals”)
  • Operator keys announce their function (e.g., “multiply”, “divide”)
  • VoiceOver users get the familiar calculator experience

All icon-only calculator controls (undo, backspace, operators) have explicit labels.

Date section headers in score and game history carry the .isHeader trait, so VoiceOver’s rotor can jump between days.

Chevrons, the person icon inside combined rows, and other visual decorations are hidden from VoiceOver so they don’t clutter navigation. All the information they convey is available through labels on functional elements.

All icon-only buttons — toolbar buttons, calculator operators, undo, backspace, the game menu — have descriptive labels rather than being read as their glyph.

  • The app uses standard SwiftUI navigation patterns, so VoiceOver gestures work as expected
  • Player scores update live — VoiceOver announces changes as they happen
  • The AirPlay display uses fixed fonts and doesn’t support VoiceOver (it’s designed for visual display on a shared screen)

Is the entire app accessible with VoiceOver?

Section titled “Is the entire app accessible with VoiceOver?”

Yes. Every screen, button, and interactive element has accessibility labels. The app has been designed with VoiceOver support from the ground up.

When a score changes, VoiceOver announces the new score for the affected player. The announcement includes the player name, new rank, and updated score.

Round 40 of 48