2025 Accessibility & Inclusion
WWDC25 · 12 min · Accessibility & Inclusion
Make your Mac app more accessible to everyone
Learn how to integrate accessibility features that take full advantage of the power and flexibility of macOS. Go beyond the basics to learn how to support VoiceOver and Voice Control, improve the layout of your views, explore how assistive technologies navigate your content, and more.
Watch at developer.apple.com ↗Chapters
Code shown on screen · 9 snippets
Contain subviews within accessibility container
// Contain subviews within accessibility container
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
FirstView()
SecondView()
}
.accessibilityElement(children: .contain)
}
} Combine subviews into one accessibility element
// Combine subviews into one accessibility element
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
FirstView()
SecondView()
}
.accessibilityElement(children: .combine)
}
} Hide subviews from accessibility
// Hide subviews from accessibility
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
FirstView()
SecondView()
}
.accessibilityElement(children: .ignore)
}
} Contain style presets in accessibility container
// Contain style presets in accessibility container
import SwiftUI
struct FormattingInspectorView: View {
var body: some View {
Form {
VStack {
StylePresetView(type: .title)
StylePresetView(type: .heading)
StylePresetView(type: .subHeading)
StylePresetView(type: .body)
}
.accessibilityElement(children: .contain)
.accessibilityLabel("Style Presets")
}
}
} Merge Title View and Button into one accessibility element
// Merge Title View and Button into one accessibility element
import SwiftUI
struct StylePresetView: View {
let preset: StylePreset
var body: some View {
HStack {
PresetTitleView(preset: preset)
Button("Apply") { /* ... */ }
}
.accessibilityElement(children: .combine)
}
} Set the order of accessibility elements
// Set the order of accessibility elements
import SwiftUI
struct BookDetailsView: View {
let book: Book
var body: some View {
VStack {
Text(book.author)
Text(book.title)
.accessibilitySortPriority(1)
DescriptionView(book: book)
}
.accessibilityElement(children: .combine)
}
} Add an accessibility rotor for bookmarked pages
// Add an accessibility rotor for bookmarked pages
import SwiftUI
struct PagesView: View {
var pages: [Page]
var body: some View {
List(pages) { page in
PageListItemView(page: page)
}
.accessibilityRotor("Bookmarks") {
ForEach(pages) { page in
if page.isBookmarked {
AccessibilityRotorEntry(page.title, id: page.id)
}
}
}
}
} Set the default VoiceOver focus
// Set the default VoiceOver focus
struct MyView: View {
(for: .voiceOver) var focusedForVoiceOver
var body: some View {
FirstView()
SecondView()
.accessibilityDefaultFocus($focusedForVoiceOver, true)
ThirdView()
}
} Add an accessibility action to bookmark the page
// Add an accessibility action to bookmark the page
import SwiftUI
struct PageListItemView: View {
var page: Page
var body: some View {
VStack() {
ThumbnailView(page: page)
Text(page.title)
}
.onHover { /* ... */ }
.accessibilityAction(named: page.isBookmarked ? "Remove Bookmark" : "Bookmark") {
page.isBookmarked.toggle()
}
}
} Resources
Related sessions
-
21 min -
28 min