VoiceOver — 是 Apple 内置的屏幕朗读器(screen reader),它能够朗读界面的每个元素,并允许用户通过手势控制设备。该技术已系统级集成到 iOS、iPadOS 和 macOS 中,无需安装额外软件。根据 Apple Accessibility (2025) 的数据,VoiceOver 支持超过 40 种语言,被全球数百万盲人和低视力用户使用。
要点
VoiceOver — 是内置于 Apple 操作系统中的屏幕朗读器(screen reader)。它专为盲人和低视力用户设计,提供无需视觉接触的设备完整交互。VoiceOver 朗读界面的所有元素:按钮、链接、文本、图片、通知和系统元素。
该技术最早于 2005 年针对 macOS 推出,并于 2009 年随 iPhone 3GS 出现在 iOS 上。从那时起,VoiceOver 已成为 Apple 生态系统不可分割的一部分,也是平台无障碍性的主要论据之一。VoiceOver 在系统级别内置 — 这意味着它无需开发者额外集成即可在任何应用中工作,尽管朗读质量直接取决于应用使用 iOS 无障碍 API 的程度。
VoiceOver 支持超过 40 种语言的自然语音合成,并适应区域语音设置。在 iOS 上,VoiceOver 使用 Siri 的语音引擎支持中文和其他语言,根据标点符号和上下文确保尽可能自然的声音和正确的语调。
VoiceOver 拦截触摸事件并以不同于标准 iOS 输入的方式解释它们。当用户触摸屏幕时,VoiceOver 不会激活手指下的元素,而是首先朗读它。只有双击后,元素才会被激活。这是关键区别,它允许盲人用户探索界面而无需担心意外点击。
VoiceOver 按逻辑顺序读取界面元素:从左到右,从上到下。阅读顺序继承自 iOS 的视图层次结构,但开发者可以通过 accessibilityElements 属性为复杂布局更改它。用户可以通过向右滑动(下一个)和向左滑动(上一个)在元素之间导航,也可以通过触摸特定元素来朗读它。
每次移动时,VoiceOver 都会读出元素类型(按钮、链接、标题)、名称(accessibilityLabel)、状态(已选、已禁用)和提示(accessibilityHint)。如果元素包含值 — 例如音量滑块 — VoiceOver 也会朗读它。无障碍特征(UIAccessibilityTraits)还会告知用户元素的行为:它是按钮、开关、搜索还是键盘键。
转子 — 是一个虚拟调节旋钮,用于切换 VoiceOver 的导航模式。用户用两根手指(像音量旋钮一样)旋转转子并选择模式:单词、字符、标题、链接、入口点、表格行等。标题模式允许在网页和应用中的 H1-H6 之间快速切换,字符模式则逐字母朗读文本,这在填写表单或输入确认码时很有用。
开发者可以通过 UIAccessibilityCustomRotor API 向转子添加自定义模式。例如,在笔记应用中,可以添加“收藏笔记”或“最近更改”转子。自定义转子显著加快了特定应用中的导航,被认为是 iOS 上无障碍性的最佳实践。
VoiceOver 使用自己的一套手势,这些手势与标准 iOS 手势不同。大多数手势用三根手指而不是一根手指执行 — 这可以防止与常规控制冲突,并允许 VoiceOver 与标准输入同时工作。
| 操作 | 手势 | 结果 |
|---|---|---|
| 朗读元素 | 1 指触摸 | 读出元素名称 |
| 激活 | 双击 | 按下按钮或链接 |
| 下一个元素 | 向右滑动 | 切换到下一个 |
| 上一个元素 | 向左滑动 | 返回上一个 |
| 滚动 | 3 指滑动 | 滚动列表或页面 |
| 转子 | 2 指旋转 | 更改导航模式 |
双击手势是 VoiceOver 中激活元素的主要方式。如果元素需要特殊操作(例如拖拽),VoiceOver 使用“触摸 — 双击并长按”序列进入移动模式。这允许在不看屏幕的情况下执行复杂手势,如拖放操作。VoiceOver 还支持“双指双击”手势取消操作,以及“三击”手势打开/关闭屏幕幕帘(Screen Curtain)。
iOS 应用开发者可以通过 UIAccessibility API 显著改善与 VoiceOver 的交互。基本的无障碍设置可以在 Interface Builder(Identity Inspector → Accessibility)中添加,但对于复杂界面,需要在代码中进行编程配置。
accessibilityLabel 属性设置 VoiceOver 为元素朗读的文本。如果未设置标签,VoiceOver 将使用按钮文本或文本字段的占位符。对于无文本元素(图标、自定义视图),标签是必需的。accessibilityTraits 属性确定元素类型:按钮、标题、开关、搜索、键盘键、可变值、链接等。
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "用户资料"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "打开资料设置屏幕"
isAccessibilityElement 标志为自定义视图启用 VoiceOver 支持 — 默认情况下仅对标准元素(UIButton、UILabel、UITextField)为 true。accessibilityHint 参数添加提示:如果用户在元素上停留,VoiceOver 会在暂停后朗读它。Hint 应描述操作的结果,而不是指令:“打开设置屏幕”而不是“按下打开”。
对于复杂屏幕,当元素的逻辑组与视觉顺序不匹配时,使用 accessibilityElements — 一个设置阅读顺序的数组。例如,产品卡片包含图片、名称、价格和“加入购物车”按钮。如果这些元素在视图层次结构中杂乱排列,accessibilityElements 将为 VoiceOver 建立正确的顺序。
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
要将多个元素合并为一个可访问元素,使用 UIAccessibilityContainer 或 accessibilityFrame 覆盖触摸区域。这在表格单元格包含多个 UI 组件但逻辑上代表一个元素时很有用 — VoiceOver 应朗读整个单元格作为整体,而不是单独浏览其内容。
为 VoiceOver 正确配置无障碍性需要注意几个方面:语义标记、动态更新、自定义元素处理以及使用真实屏幕朗读器进行测试。
在 SwiftUI 中,无障碍性通过 .accessibilityLabel()、.accessibilityValue()、.accessibilityHint() 和 .accessibilityAddTraits() 修改器进行配置。SwiftUI 自动从标准元素继承无障碍性,但对于自定义组件,需要显式配置。例如,自定义滑块必须告知 VoiceOver 其值和更改格式。
Slider(value: $volume, in: 0...100)
.accessibilityLabel("音量")
.accessibilityValue(
Text("\(Int(volume)) 百分比")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
accessibilityAdjustableAction 修改器添加了通过 VoiceOver 手势更改值的功能:向上滑动 — 增加,向下滑动 — 减少。没有此修改器,滑块将无法通过屏幕朗读器进行控制。自定义步进器、选择器和其他更改其值的元素也需要类似的配置。
当屏幕上的内容动态更改时(出现通知、加载状态更新、价格变化),VoiceOver 应通过 UIAccessibility.post 接收通知。没有此调用,屏幕朗读器将不知道更改,用户将错过重要信息。对于 SwiftUI,使用 .accessibilityAnnouncement() 修改器。
UIAccessibility.post(
notification: .announcement,
argument: "价格降低了 20%"
)
// SwiftUI
Text("价格已更新")
.accessibilityAnnouncement(Text("享受 20% 折扣"))
VoiceOver 通知应明智使用:过多的公告会打扰用户,而没有通知则使应用无法访问。最佳策略 — 仅公告影响用户当前工作流程的更改:购物车更新、加载状态、表单验证错误、聊天通知。后台更改(栏上的时间、汇率)无需公告 — 用户将在需要时自行检查。
VoiceOver 测试通过启用屏幕朗读器的物理设备或带有 Accessibility Inspector 选项的 iOS 模拟器进行。测试完整使用场景很重要:在没有视觉控制的情况下完成注册、下订单、通过搜索找到产品。如果路径在没有视觉反馈的情况下可通行 — VoiceOver 配置正确。
常见问题
设置 → 无障碍 → VoiceOver。打开开关。快速开启可使用三次按下侧边按钮(iPhone X 及更新机型)或主屏幕按钮。Siri 也可以通过“开启 VoiceOver”命令开启 VoiceOver。
VoiceOver — Apple 的 iOS 屏幕朗读器,TalkBack — Google 的 Android 屏幕朗读器。工作原理相同:触摸朗读,双击激活。区别在于手势、转子设置和生态系统集成:VoiceOver 与 iCloud 和 Apple Pay 的集成更深。
使用 UIAccessibility API:为所有元素设置 accessibilityLabel,为元素类型设置 accessibilityTraits,为提示设置 accessibilityHint。在 SwiftUI 中应用 .accessibilityLabel() 和 .accessibilityAddTraits() 修改器。在开启 VoiceOver 的情况下测试应用。
转子 — 是一种通过两指旋转切换的导航模式。它确定如何在元素之间移动:按标题、字符、单词、链接或入口点。开发者可以通过 UIAccessibilityCustomRotor 添加自己的模式。
对于自定义 UIView,您需要设置 isAccessibilityElement = true 并指定 accessibilityLabel。如果元素由多个子视图组成,请使用 accessibilityElements 设置阅读顺序或将它们合并到一个容器中。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。