VoiceOver & Accessibility Labels
Describe controls for assistive tech.
VoiceOver & Accessibility Labels is a free SwiftUI Academy lesson on CoddyKit — lesson 1 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the SwiftUI Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
What Is VoiceOver?
VoiceOver is Apple's screen reader. It speaks your interface aloud so people who can't see the screen can still use your app. 🔊
SwiftUI Helps You
The good news: SwiftUI auto-generates accessibility for standard views. A Text already reads its content, so you start ahead.
When Labels Go Missing
An icon-only button has no readable text, so VoiceOver may say nothing useful. That's when you add an explicit accessibility label.
Button(action: save) {
Image(systemName: "square.and.arrow.down")
}Adding a Label
Attach accessibilityLabel to describe what a control does in plain words, not how it looks.
Button(action: save) {
Image(systemName: "square.and.arrow.down")
}
.accessibilityLabel("Save")Label, Not Appearance
Write the label as the user's goal. Say Save, not "down arrow icon". The label is meaning, never decoration.
Adding Hints
An accessibilityHint tells the user what happens after they act. It is read after the label, with a short pause.
.accessibilityLabel("Save")
.accessibilityHint("Saves your note to the list")Reading the Value
For controls that hold data, accessibilityValue announces the current state, like a slider reading "70 percent".
Slider(value: $level)
.accessibilityValue("\(Int(level)) percent")Grouping Elements
Use accessibilityElement(children:) to merge a card's pieces into one swipe, so VoiceOver reads it as a single unit.
VStack { Text(name); Text(role) }
.accessibilityElement(children: .combine)Marking Roles with Traits
Add accessibilityAddTraits so VoiceOver announces a view's role, like calling a tappable card a button.
.accessibilityAddTraits(.isButton)Hiding Decoration
Purely decorative images add noise. Use accessibilityHidden(true) to skip them so VoiceOver focuses on what matters.
Image("sparkle")
.accessibilityHidden(true)Test It Yourself
Turn on VoiceOver in the Accessibility settings and swipe through your app. Hearing it is the fastest way to spot gaps.
Quick Check
You have an icon-only button. Which modifier gives VoiceOver a readable name?
Recap
You learned to make controls speak: add an accessibilityLabel for icons, hints for outcomes, and group or hide views so VoiceOver flows clearly. ✨
Frequently asked questions
Is the “VoiceOver & Accessibility Labels” lesson free?
Yes — the full text of “VoiceOver & Accessibility Labels” is free to read here on the web, and the SwiftUI Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the SwiftUI Academy course, upgrade to CoddyKit PRO.
What will I learn in “VoiceOver & Accessibility Labels”?
Describe controls for assistive tech. You practise SwiftUI Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start SwiftUI Academy?
No prior experience is required. SwiftUI Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 1 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “VoiceOver & Accessibility Labels” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this SwiftUI Academy lesson?
Yes. Every SwiftUI Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- VoiceOver & Accessibility Labels
- Dynamic Type & Scaled Fonts
- Localizing Strings & String Catalogs
- Adapting to Light & Dark Mode