View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Videos

Open Menu Close Menu
  • Collections
  • All Videos
  • About

More Videos

  • About
  • Code
  • Prepare your app for Accessibility Nutrition Labels

    Learn how to prepare your app for Accessibility Nutrition Labels by supporting essential accessibility features. Discover how you can enhance interaction methods like VoiceOver and Voice Control by properly configuring accessibility labels, traits, and values for custom controls and gestures. Find out how you can support larger text sizes using Dynamic Type, and prevent content truncation with flexible layouts. And learn how to make your app design more inclusive by adopting Dark Mode, responding to preferences like Differentiate Without Color, and ensuring sufficient contrast.

    Chapters

    • 0:01 - Welcome
    • 2:18 - Interaction methods
    • 18:04 - Larger text
    • 26:27 - Color
    • 32:55 - Next steps

    Resources

    • Overview of Accessibility Nutrition Labels
    • Accessibility
    • Learn more about designing for accessibility
      • HD Video
      • SD Video

    Related Videos

    WWDC25

    • Evaluate your app for Accessibility Nutrition Labels

    WWDC24

    • Catch up on accessibility in SwiftUI
    • Get started with Dynamic Type
  • Search this video…
    • 6:39 - Add descriptive accessibility labels

      // Add descriptive accessibility labels
      
      // SwiftUI
      Image(landmark.backgroundImageName)
        .accessibilityLabel("Vibrant cherry blossoms frame a snow-capped mountain rising in the background.")
      
      
      // UIKit
      let imageView = UIImageView(image: UIImage(named: landmark.backgroundImageName))
      imageView.isAccessibilityElement = true
      imageView.accessibilityLabel = "Vibrant cherry blossoms frame a snow-capped mountain rising in the background."
    • 7:43 - Add alternate labels for Voice Control

      // Add alternate labels for Voice Control
      
      Button {
        addFavorite()
      } label: {
        Image(systemName: "heart")
      }
      .accessibilityLabel("Favorite")
      .accessibilityInputLabels(["Favorite", "Heart", "Like", "Love"])
    • 8:23 - Set accessibility traits to match an element’s role

      // Set accessibility traits to match an element’s role
      
      // SwiftUI
      Text("Accessibility Nutrition Labels")
        .font(.title)
        .accessibilityAddTraits(.isHeader)
      
      
      // UIKit
      let label = UILabel()
      /*...*/
      label.accessibilityTraits = .header
    • 9:29 - Implement custom adjustable behavior

      // Implement custom adjustable behavior
      
      // SwiftUI
      MySliderView()
        .accessibilityAdjustableAction { direction in
          switch direction {
          case .increment:
            // Increase value
          case .decrement:
            // Decrease value
          }
        }
      
      
      // UIKit
      class MySliderView: UIView {
        override var accessibilityTraits: UIAccessibilityTraits { get { .adjustable } set {} }
        override func accessibilityIncrement() { /* Increase value */ }
        override func accessibilityDecrement() { /* Decrease value */ }
      }
    • 9:54 - Set an accessibility value

      // Set an accessibility value
      
      // SwiftUI
      MyView()
        .accessibilityValue("Value")
      
      
      // UIKit
      myView.accessibilityValue = "Value"
    • 12:26 - Hide decorative images from VoiceOver

      // Hide decorative images from VoiceOver
      
      // SwiftUI
      Image(decorative: landmark.thumbnailImageName)
      /* or */
      Image(landmark.thumbnailImageName)
        .accessibilityHidden(true)
      
      
      // UIKit
      imageView.isAccessibilityElement = false
    • 12:59 - Combine elements to improve VoiceOver navigation

      // Combine elements to improve VoiceOver navigation
      
      HStack {
        HStack {
          Text("SFO")
          Image(systemName: "airplane.departure")
            .accessibilityLabel("to")
          Text("HND")
        }
        .font(.title3.bold())
        Spacer()
        VStack {
          Text("Arriving in")
          Text("15").font(.title.bold())
          Text("minutes")
        }
      }
      .accessibilityElement(children: .combine)
    • 15:03 - Make a custom component accessible

      // Make a custom component accessible
      
      HStack {
        ForEach(1...5, id: \.self) { index in
          Image(systemName: index <= Int(badgeProgress.rating) ? "star.fill" : "star") 
        }
      }
      .accessibilityElement()
      .accessibilityLabel("Rating")
      .accessibilityValue("\(Int(badgeProgress.rating))")
      .accessibilityAdjustableAction { direction in
        switch direction {
        case .increment:
          badgeProgress.rating = min(5, badgeProgress.rating + 1)
        case .decrement:
          badgeProgress.rating = max(0, badgeProgress.rating - 1)
        }
      }
    • 15:37 - Make a custom component accessible

      // Make a custom component accessible
      
      HStack {
        ForEach(1...5, id: \.self) { index in
          Image(systemName: index <= Int(badgeProgress.rating) ? "star.fill" : "star")
        }
      }
      .accessibilityRepresentation {
        Slider(value: $badgeProgress.rating, in: 0...5, step: 1.0) {
          Text("Rating")
        }
      }
    • 16:30 - Add accessibility traits for tap gestures

      // Add accessibility traits for tap gestures
      
      HStack {
        Text("Learn more")
        Image(systemName: "chevron.forward")
      }
      .foregroundColor(.blue)
      .onTapGesture {
        /*...*/
      }
      .accessibilityAddTraits(.isButton)
    • 17:13 - Add accessibility actions for custom gestures

      // Add accessibility actions for custom gestures
      
      Image(landmark.backgroundImageName)
        .accessibilityLabel(landmark.imageDescription ?? landmark.name)
        .onTapGesture(count: 2) {
          modelData.addFavorite(landmark)
        }
        .accessibilityAction(named: "Favorite") {
          modelData.addFavorite(landmark)
        }
    • 20:07 - Adopt system text styles for automatic scaling

      // Adopt system text styles for automatic scaling
      
      // SwiftUI
      Text("Hello World")
        .font(.body)
      
      
      // UIKit
      label.font = UIFont.preferredFont(forTextStyle: .body)
      label.adjustsFontForContentSizeCategory = true
    • 20:33 - Make custom fonts scale proportionally with system font styles

      // Make custom fonts scale proportionally with system font styles
      
      // SwiftUI
      Text("Hello World")
        .font(.custom("MyFont", size: 17, relativeTo: .body))
      
      
      // UIKit
      guard let customFont = UIFont(name: "MyFont", size: 17) else { return }
      label.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: customFont)
      label.adjustsFontForContentSizeCategory = true
    • 22:57 - Embed content in ScrollView to avoid truncation

      // Embed content in ScrollView to avoid truncation
      
      ScrollView {
        VStack(spacing: 24) {
          EarnedBadgeView(badge: badge)
          Text("Congratulations!")
          Text("...")
        }
      }
      .scrollBounceBehavior(.basedOnSize)
      .safeAreaBar(edge: .bottom) {
          VStack {
              Button("Share badge") { }
              Button("Close") { }
          }
      }
    • 25:17 - Set number of lines to 0 to avoid truncation

      // Set number of lines to 0 to avoid truncation
      
      // SwiftUI
      
      Text("Some longer text that takes up multiple lines.")
        .lineLimit(nil)
      
      
      // UIKit
      
      label.numberOfLines = 0
    • 26:53 - Check the differentiate without color setting

      // Check the differentiate without color setting
      
      // SwiftUI
      
      @Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor
      
      
      // UIKit
      
      let differentiateWithoutColor = UIAccessibility.shouldDifferentiateWithoutColor
      NotificationCenter.default.addObserver(self, selector: #selector(diffWithoutColorDidChange), name: UIAccessibility.differentiateWithoutColorDidChangeNotification, object: nil)
    • 27:42 - Differentiate without color alone in Swift Charts

      // Differentiate without color alone in Swift Charts
      
      Chart(visitorData) { data in
        LineMark(
          x: .value("Month", data.month),
          y: .value("Visitors", data.numVisitors)
        )
        .foregroundStyle(by: .value("Landmark", data.landmark))
      
        PointMark(
          x: .value("Month", data.month),
          y: .value("Visitors", data.numVisitors)
        )
        .foregroundStyle(by: .value("Landmark", data.landmark))
        .symbol(by: .value("Landmark", data.landmark))
      }
    • 30:36 - Check the preference for Reduce Transparency

      // Check the preference for Reduce Transparency
      
      // SwiftUI
      
      @Environment(\.accessibilityReduceTransparency) var reduceTransparencyEnabled
      
      
      // UIKit
      
      let reduceTransparencyEnabled = UIAccessibility.isReduceTransparencyEnabled
      NotificationCenter.default.addObserver(self, selector: #selector(reduceTransparencyDidChange), name: UIAccessibility.reduceTransparencyStatusDidChangeNotification, object: nil)
    • 31:22 - Check the preference for Increase Contrast

      // Check the preference for Increase Contrast
      
      // SwiftUI
      
      @Environment(\.colorSchemeContrast) var colorSchemeContrast
      
      
      // UIKit
      
      let increaseContrastEnabled = view.traitCollection.accessibilityContrast == .high
      registerForTraitChanges([UITraitAccessibilityContrast.self], action: #selector(accessibilityContrastDidChange))

Developer Footer

  • Videos
  • Tech Talks
  • Prepare your app for Accessibility Nutrition Labels
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines