View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 让所有人都能更方便地使用你的 Mac App

    了解如何整合那些可充分利用 macOS 强大功能和灵活性的辅助功能。深入探索如何支持“旁白”和“语音控制”,如何改进视图的布局,以及辅助技术如何导航你的内容,等等。

    章节

    • 0:00 - 开场介绍
    • 0:44 - 布局
    • 7:48 - 导航
    • 9:52 - 交互

    资源

    • Accessibility
    • Human Interface Guidelines: Accessibility
      • 高清视频
      • 标清视频

    相关视频

    WWDC24

    • 了解 SwiftUI 中的辅助功能

    WWDC21

    • SwiftUI 辅助功能:超越基础功能
  • 搜索此视频…

    大家好 我叫 Nicholas 是辅助功能团队的工程师 辅助功能让每个人都能体验 并爱上你创建的 App 今天 我将深入介绍 如何让所有人都能更方便地 使用你的 Mac App Mac App 主要通过键盘和鼠标 进行交互 具有更密集的用户界面 和强大的多任务处理能力 这些 Mac 特有的属性带来了 一些重要的辅助功能考量 今天我将一一介绍

    这包括将 App 的布局 传达给辅助功能 加快 App 内的导航速度 以及使 App 内的交互更易于使用 在 Mac 上 App 有充足的空间 来显示控件和内容 就像你从视觉上设计界面布局 使它容易理解且直观易用 思考如何将界面布局 传达给辅助功能技术 也非常重要 SwiftUI 将构成 App 的各个视图 作为辅助功能元素来传达 辅助功能元素包含 辅助功能技术理解 和与你的 App 交互 所需的信息 如果你对辅助功能元素不熟悉 建议你观看 WWDC24 讲座 “了解 SwiftUI 中的辅助功能” 我正使用 SwiftUI 构建一个新的 Mac App 来编辑文本文稿

    它有一个边栏 可以切换页面 以及用书签标记重要页面

    还有一个包含控件的检查器 我可以用来设置所选文本的格式 包括一个样式预设列表 我可以用来 一次性应用多个格式选项

    我真心希望它成为一款 出色的 Mac App 我知道这意味着 让所有人都能更方便地使用它 所以从一开始 我就在设计基础的辅助功能 并测试我使用“旁白”添加的新功能

    “旁白”是一款屏幕朗读器 可以辅助 不同视力水平的人使用你的 App 旁白能将 App 界面转为语音朗读 在无障碍文本编辑器上使用旁白 或转换为盲文 使用旁白也是 测试 App 辅助功能的绝佳方式 因为它可以充分利用 App 提供的 所有辅助功能信息 如果你的 App 与旁白配合良好 那么它也将能够良好地兼容 其他辅助功能技术 比如语音控制和切换控制

    在 Mac 上 旁白主要 通过键盘快捷键控制 例如 可以使用键盘快捷键 移动到屏幕上的下一个 和上一个元素 使用这些键盘快捷键 我可以将旁白焦点 一次移动到一个元素上 以收听对应元素的描述

    最小化 按钮 全屏 按钮 工具栏 我的文本文稿 边栏 表 垂直分隔线 编辑文本 在文本末尾插入 垂直分隔线 格式检查器 滚动区域 鼠标在屏幕上快速移动 即可完成的操作 对于使用旁白功能的用户来说 可能需要多次按键

    在后台 旁白会移动到 SwiftUI 提供的下一个辅助功能元素

    为了加快旁白的导航速度 SwiftUI 可以将辅助功能元素分组为 容器辅助功能元素

    旁白使用键盘快捷键 将焦点移入和移出这些容器 默认情况下 在 Mac 上 旁白按容器导航 以便更快地 在 App 中移动 并且仅在需要时将焦点放入容器 Mac 上的辅助功能 与 iPhone 和 iPad 等其他平台 的一个主要区别在于 Mac 上的容器通常包含嵌套容器 形成树状的辅助功能元素结构 这个结构代表着 App 界面 在你的 App 中 将相关元素分组到容器中 以加快旁白的导航速度

    同时 也要注意避免 创建太多层嵌套容器 有时这会导致更难以 在 App 中找到元素 并增加反复聚焦容器的时间

    要优化 App 中的容器 可以使用 accessibilityElement children 修饰符

    将修饰符应用于视图时 指定的行为 将决定视图和它的子视图 如何传达给辅助功能 有三种不同的行为选项

    contain 将视图表示为辅助功能容器 子视图是容器中的辅助功能元素

    combine 将视图和它的子视图表示为 一个辅助功能元素 将它们的所有属性和操作合并在一起 ignore 将视图表示为 一个辅助功能元素 完全忽略子视图

    当我使用旁白测试 App 时 我发现了几个需要优化的地方 首先 我使旁白焦点逐个元素地 在右侧的格式检查器中移动 在格式检查器中 滚动区域 22 个项目 标题样式 标题 应用 按钮 副标题 应用 按钮 小标题 应用 按钮 正文 应用 按钮 粗体 切换按钮 我注意到 我必须浏览完 每一个样式预设 才能到达“粗体 切换 按钮” 这些样式预设使用 VStack 显示

    我可以使用 accessibilityElement children 修饰符 和 VStack 上的 contain 行为 来创建一个容器 还可以使用 accessibilityLabel 修饰符来为这个容器命名

    现在 我将再次尝试 使旁白焦点逐个元素地 在右侧的格式检查器中移动 在格式检查器中 滚动区域 15 个项目 标题样式 样式预设 组 粗体 切换按钮 这太棒了 我无需遍历所有样式预设 除非我确实需要这样做 我想确保在这个样式预设容器内 导航正常 我将旁白焦点放到样式预设容器中 然后使旁白焦点逐个元素地移动

    在样式预设中 组 8 个项目 标题 应用 按钮 副标题 应用 按钮 小标题 应用 按钮 正文 应用 按钮 导航正常工作 但我注意到 旁白分别聚焦到 每个样式预设的标题和应用按钮上

    样式预设由包含标题视图 和按钮视图的 HStack 表示

    我可以使用 accessibilityElement children 修饰符 和 HStack 上的 combine 行为 来创建一个辅助功能元素 它将标题视图和按钮视图的属性 合并到一起

    现在 我将再次尝试 使旁白焦点逐个元素地 在样式预设容器中移动 在样式预设中 组 4 个项目 标题 应用 按钮 副标题 应用 按钮 小标题 应用 按钮 正文 应用 按钮 现在 我可以将每个样式预设 作为一个元素来浏览 这样更容易导航和理解

    辅助功能结构另一个 可以优化的方面是 元素的顺序 在这个示例中 作者显示在书名之前 但我希望旁白先朗读书名 因为这样方便快速浏览大量书籍 我可以使用 accessibilitySortPriority 修饰符 改变辅助功能元素的顺序

    如果我赋予书名视图更高的优先级 它将排在第一位 默认情况下 视图的排序优先级为零 具有相同优先级的视图 按照视觉位置排序 现在 旁白会先朗读书名 然后再朗读作者和描述 在使用旁白测试 App 时 如果感觉顺序不合理 请使用 accessibilitySortPriority 修饰符

    现在 App 的辅助功能结构 已经优化完毕 我想通过转子进一步优化导航

    借助 App 中的书签功能 用户可以 快速浏览页面列表 查看哪些页面添加了书签 但是 使用旁白的用户则必须 逐页浏览 才能知道它们是否添加了书签 第 2 页已添加书签 第 3 页 第 4 页 第 5 页已添加书签 第 6 页 第 7 页 第 8 页已添加书签 第 9 页 第 10 页 为了让这个过程像视觉体验一样简单 使用旁白的用户需要能够 仅按已添加书签的页面进行导航

    为此 我可以使用转子 转子是加快使用旁白的用户 导航速度的重要方式 转子允许你在 App 中定义 视图 或文本范围的集合 以便在它们之间快速移动 要将书签转子添加到我的页面列表 我将使用 accessibilityRotor 修饰符 将它命名为“书签” 我可以有条件地声明要将哪些页面 包含在“书签”转子中 现在 当我将旁白焦点放在 边栏中的页面列表上时 我可以使用键盘快捷键打开转子菜单 在这里我可以快速浏览所有书签 并直接跳转到我想要的书签页面 书签菜单 第 2 页 第 5 页 第 5 页已添加书签

    辅助功能转子使原本对旁白用户而言 耗时又复杂的导航体验变得简单流畅

    当我使用旁白在 App 中导航时 我移动的是旁白焦点 旁白等辅助功能技术 维护自己的焦点状态 独立于键盘焦点

    在 macOS 和 iOS 26 中 你的 App 可以建议一个初始焦点 供旁白等辅助功能技术使用 这通过 accessibilityDefaultFocus 修饰符来实现 当出现新场景时 SwiftUI 会建议聚焦于 带有这个修饰符的视图 同时仍然允许辅助功能技术 根据用户的偏好做出最优决策

    现在 我已经可以轻而易举地 导航到 App 中的所有元素 我还想确保与这些元素的交互 也同样便捷 我在 App 中添加了一个功能 将鼠标悬停在页面缩略图上时 会弹出一个按钮 用于为页面添加书签 从视觉上看 这很不错 因为当我不需要这个按钮时 缩略图不会被遮挡 但是 由于旁白用户不会移动指针 他们永远无法使用这个按钮

    在 App 中 任何依赖悬停指针 或触控板手势的交互 可能并非人人可用 你应该提供其他方式来发现 和执行这些交互

    幸运的是 SwiftUI 提供了一种 简单的方法来实现这一点 你可以向视图添加辅助功能操作 以便旁白等辅助功能技术可以提供 无障碍的执行方式 要向视图添加辅助功能操作 使用 accessibilityAction 修饰符 我使用这个修饰符 向页面列表中的视图添加书签操作 就像添加按钮一样简单

    现在 我将使用旁白 来聚焦于页面缩略图 并使用新的书签辅助功能操作 第 3 页 操作菜单 两个项目 显示备选项 为第 3 页添加书签 为第 3 页添加书签

    我能够使用键盘快捷键打开操作菜单 并轻松为页面添加书签 其他辅助功能技术 例如切换控制和语音控制 也依赖于这些辅助功能操作

    另一个快速改善 App 交互的方法 是键盘快捷键 为 App 中的常见任务 添加键盘快捷键 不仅是一项强大的高级用户功能 对辅助功能也有很大帮助 尤其是对于无法使用鼠标的用户 最后 如果你创建自己的自定控件 它们可能不具备其他控件内置的 辅助功能信息 要了解如何在 SwiftUI 中轻松实现 控件辅助功能 我建议你观看“SwiftUI 辅助功能:超越基础功能” 这是一个 WWDC21 讲座 现在该轮到你了 不妨在 Mac 上 使用旁白测试你的 App 优化 App 中的容器 并研究可以在哪里添加自定转子 最后 你可以使用辅助功能标签 彰显 App 出色的辅助功能 要进一步了解 请观看 “针对辅助功能标签评估你的 App” 感谢观看

    • 4:15 - 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)
        }
      }
    • 4:23 - 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)
        }
      }
    • 4:33 - Hide subviews from accessibility

      // Hide subviews from accessibility
      
      import SwiftUI
      
      struct ContentView: View {
        var body: some View {
          VStack {
            FirstView()
            SecondView()
          }
          .accessibilityElement(children: .ignore)
        }
      }
    • 5:12 - 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")
          }
        }
      }
    • 6:21 - 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)
        }
      }
    • 7:01 - 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)
        }
      }
    • 8:43 - Add an accessibility rotor for bookmarked pages

      // Add an accessibility rotor for bookmarked pages
      
      import SwiftUI
      
      struct PagesView: View {
        @Binding 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)
              }
            }
          }
        }
      }
    • 9:33 - Set the default VoiceOver focus

      // Set the default VoiceOver focus
      
      struct MyView: View {
        @AccessibilityFocusState(for: .voiceOver) var focusedForVoiceOver
      
        var body: some View {
          FirstView()
          SecondView()
            .accessibilityDefaultFocus($focusedForVoiceOver, true)
          ThirdView()
        }
      }
    • 10:28 - 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()
          }
        }
      }
    • 0:00 - 开场介绍
    • 了解如何增强 Mac App 的辅助功能。探索布局呈现、导航加速和交互辅助功能方面的最佳做法,确保每个人都能畅享 Mac App。

    • 0:44 - 布局
    • 借助 macOS 上的 SwiftUI,你可以让所有人都能轻松使用你的 App,尤其是那些依赖旁白的用户。SwiftUI 会从视图创建辅助功能元素,但你应该优化这个结构以实现最佳导航体验。 macOS 辅助功能的关键方面包括将相关元素分组到容器中,形成树状结构,从而加快导航速度。你可以使用 accessibilityElement(children:) 等修饰符来指定视图及它们的子视图是表示为容器、组合元素还是被忽略。 例如,在 Nicholas 的文本编辑器 App 中,通过将样式预设分组并将“标题”和“应用”按钮组合为单个元素,对格式检查器进行了优化。此外,使用 accessibilitySortPriority 修饰符可对元素重新排序,确保首先读取更重要的信息。

    • 7:48 - 导航
    • 示例 App 通过转子增强了辅助功能,转子是一种旁白功能,可让用户在特定内容 (如已添加为书签的页面) 之间快速跳转。这简化了导航流程,让使用旁白的用户也能高效地进行导航。SwiftUI 中新增的修饰符可以建议初始焦点。

    • 9:52 - 交互
    • 在 SwiftUI App 中,确保所有交互不仅限于基于指针的操作方式。请为使用旁白、切换控制和语音控制的用户提供辅助功能操作和键盘快捷键。

Developer Footer

  • 视频
  • WWDC25
  • 让所有人都能更方便地使用你的 Mac App
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则