{ "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json", "schemaVersion": 1, "id": "wwdc2026-220", "event": "wwdc2026", "eventName": "WWDC26", "year": 2026, "eventContentId": 220, "title": "Refine accessibility for custom controls", "description": "Unlock the full potential of your app’s interactive elements by making them accessible to everyone. We’ll break down how people understand and use controls with VoiceOver and other assistive technologies, exploring a variety of input methods like actions, the passthrough gesture, and direct touch. Join us for an in-depth exploration of several example controls as we refine and elevate the accessibility experience in each one.", "url": "https://developer.apple.com/videos/play/wwdc2026/220", "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/220", "type": "Video", "publishedAt": "2026-06-08T14:00:00-07:00", "platforms": [ "iOS", "iPadOS", "macOS", "tvOS", "visionOS", "watchOS" ], "keywords": [], "topics": [ "SwiftUI & UI Frameworks", "Accessibility & Inclusion" ], "primaryTopic": "Accessibility & Inclusion", "duration": 985, "hasTranscript": true, "transcriptWordCount": 2192, "availableLanguages": [ "eng", "fra", "jpn", "kor", "por", "spa", "zho" ], "media": { "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/cmaf.m3u8", "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/cmaf-download.m3u8", "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/downloads/wwdc2026-220_sd.mp4", "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/220/4/945f8d34-8427-4476-ae75-34edc4a9c3f9/downloads/wwdc2026-220_hd.mp4", "duration": 985 }, "codeSnippets": [ { "title": "Improve accessibility for coffee dispenser", "language": "swift", "startTimeSeconds": 301, "code": "// Improve accessibility for coffee dispenser\n\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n @State var coffee: Double = 0.0\n var body: some View {\n CoffeeSlider(value: coffee)\n .accessibilityElement()\n .accessibilityLabel(\"Coffee Dispenser\")\n .accessibilityValue(\"\\(Int(coffee)) ounces\")\n .accessibilityAddTraits(.adjustable)\n .accessibilityAdjustableAction { direction in\n switch direction {\n case .increment:\n increaseCoffeeAmount()\n case .decrement:\n decreaseCoffeeAmount()\n }\n }\n }\n}" }, { "title": "Set the accessibility activation point", "language": "swift", "startTimeSeconds": 425, "code": "// Set the accessibility activation point\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n @State var coffee: Double = 0.0\n\n var body: some View {\n CoffeeSlider(value: coffee)\n .accessibilityActivationPoint(\n UnitPoint(x: 0.5, y: 1 - coffee)\n )\n }\n}" }, { "title": "Post accessibility announcements", "language": "swift", "startTimeSeconds": 447, "code": "// Post accessibility announcements \n\nimport SwiftUI\n\nstruct CoffeeDispenserView: View {\n @State var coffee: Double = 0.0\n\n var body: some View {\n CoffeeSlider(value: coffee)\n // ...\n .onChange(of: coffee) { _, newValue in\n if sufficientTimeSinceLastAnnouncement() && valueHasChanged() {\n cacheLastSpokenValue(newValue)\n AccessibilityNotification\n .Announcement(newValue)\n .post()\n }\n }\n }\n}" }, { "title": "Add custom actions", "language": "swift", "startTimeSeconds": 613, "code": "// Add custom actions\n\nimport SwiftUI\n\nstruct EqualizerView: View {\n var body: some View {\n EqualizerPad()\n .accessibilityActions(\"Move Up\") {\n increaseY(by: 10)\n }\n .accessibilityActions(\"Move Right\") {\n increaseX(by: 10)\n }\n .accessibilityActions(\"Move Down\") {\n decreaseY(by: 10)\n }\n .accessibilityActions(\"Move Left\") {\n decreaseX(by: 10)\n }\n }\n }" }, { "title": "Customize accessibility for the interactive cat surface", "language": "swift", "startTimeSeconds": 767, "code": "// Customize accessibility for the interactive cat surface\n\nimport SwiftUI\n\nstruct VirtualCat: View {\n var cat: CatModel\n var body: some View {\n InteractiveCatSurface()\n .accessibilityLabel(\"Virtual Cat\")\n .accessibilityValue(cat.currentReaction.description)\n .accessibilityDirectTouch([.requiresActivation])\n }\n}" } ], "resources": [ { "title": "Accessible controls", "url": "https://developer.apple.com/documentation/SwiftUI/Accessible-controls", "type": "documentation", "description": "Improve access to actions that your app can undertake.", "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessible-controls", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessible-controls.json" }, { "title": "Accessible descriptions", "url": "https://developer.apple.com/documentation/SwiftUI/Accessible-descriptions", "type": "documentation", "description": "Describe interface elements to help people understand what they represent.", "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessible-descriptions", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessible-descriptions.json" }, { "title": "Accessibility fundamentals", "url": "https://developer.apple.com/documentation/SwiftUI/Accessibility-fundamentals", "type": "documentation", "description": "Make your SwiftUI apps accessible to everyone, including people with", "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Accessibility-fundamentals", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Accessibility-fundamentals.json" }, { "title": "Creating accessible views", "url": "https://developer.apple.com/documentation/SwiftUI/creating-accessible-views", "type": "samplecode", "description": "Make your app accessible to everyone by applying accessibility modifiers to your SwiftUI views.", "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/creating-accessible-views", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/creating-accessible-views.json" } ], "path": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/", "files": { "metadata": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/metadata.json", "readme": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/README.md", "transcript": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/transcript.md", "transcriptJSON": "sessions/wwdc2026/220-refine-accessibility-for-custom-controls/transcript.json" } }