VoiceOver基础:开启与关闭、基本手势、转子操作、自定义标签

好,咱们今天聊聊 VoiceOver。这是 iOS 无障碍的基石,也是每个开发者必须掌握的第一课。

说实话,我刚接触 VoiceOver 时也觉得有点懵。一个看不见屏幕的人,怎么跟手机交互?后来我亲自闭着眼睛试了十分钟,才真正理解——这不是「盲人专用模式」,而是一套全新的交互逻辑。你想想看,我们平时靠眼睛定位,而 VoiceOver 用户靠的是手指滑动和声音反馈。

开启与关闭:三种方式

先解决最基础的问题:怎么打开它?

方式一:设置路径
「设置」→「辅助功能」→「旁白」→ 打开开关。这是最稳妥的方式,适合第一次配置。

方式二:Siri 唤醒
直接说「嘿 Siri,打开旁白」。我个人习惯用这个,尤其是在测试时手忙脚乱的时候。

方式三:快捷键(我最推荐的)
连按三次侧边按钮(iPhone X 及以后机型),或者连按三次 Home 键(旧机型)。

我的小技巧: 开发阶段建议把「辅助功能快捷键」设为 VoiceOver。这样你连按三次就能开关,不用每次都进设置。我在项目中经常要反复开关测试,这个快捷键救了我不少时间。
注意: 开启 VoiceOver 后,触控手势会完全改变。普通点击变成「选中」,双击才触发操作。第一次用可能会觉得手机「卡住了」,别慌,这是正常现象。

基本手势:记住这五个就够了

VoiceOver 的手势体系其实很简洁。我把它总结为五个核心操作:

手势 操作 效果
单指轻点 触摸屏幕 选中并朗读该元素
单指双击 轻点两下 激活选中的元素(相当于点击)
单指右滑/左滑 水平滑动 移动到下一个/上一个元素
单指上滑/下滑 垂直滑动 改变转子设置(后面细说)
三指滑动 三指水平滑动 滚动页面(一屏一屏地翻)

嗯,这里要注意:单指滑动是「逐元素移动」,三指滑动是「滚动页面」。这两个容易搞混。我曾经在演示时用三指滑动去选元素,结果页面直接跳到了底部,场面一度很尴尬。

转子操作:VoiceOver 的瑞士军刀

转子是什么?说白了就是一个虚拟的旋钮。你用两根手指在屏幕上旋转,就能切换不同的导航模式。

默认转子选项包括:

  • 字符:逐字母朗读,适合校对文字
  • 单词:逐词朗读,适合阅读长文本
  • :逐行朗读,适合浏览代码或列表
  • 标题:在标题间跳转,适合浏览文章结构
  • 链接:在可点击链接间跳转
  • 容器:在页面区块间跳转

操作方式很简单:两根手指在屏幕上顺时针或逆时针旋转,VoiceOver 会播报当前选中的转子模式。然后单指上下滑动,就能按该模式逐项移动。

为什么叫「转子」? 因为它的交互逻辑很像老式收音机的调频旋钮。你旋转它,切换模式;然后上下滑动,就像在调频段里找台。这个比喻很形象,我第一次听就记住了。

我在项目中遇到过一个问题:用户反馈说「转子选项太多,切换起来很累」。后来我建议在「设置→辅助功能→旁白→转子」里,把不需要的选项关掉。比如一个阅读类 App,只保留「字符」「单词」「行」就够了。这个优化让用户的操作效率提升了不少。

自定义标签:让 VoiceOver 说人话

这是开发者最需要关注的部分。默认情况下,VoiceOver 会朗读控件的类型和标题。比如一个「发送」按钮,它会读「发送,按钮」。但有些场景下,默认的朗读内容不够友好。

举个例子:一个显示「未读消息 3 条」的标签。默认 VoiceOver 会读「3,标签」。这显然不够直观。用户想知道的是「有 3 条未读消息」,而不是一个数字。

解决方案就是 accessibilityLabel

// Swift
messageLabel.accessibilityLabel = "未读消息 \(count) 条"

// 或者用 storyboard,在 Identity Inspector 里设置 Accessibility Label

还有 accessibilityHint,用来描述操作后的结果:

// 比如一个「删除」按钮
deleteButton.accessibilityHint = "删除后将无法恢复"

VoiceOver 会先读 Label,再读 Hint,最后读 Trait(控件类型)。顺序是:Label → Hint → Trait

我的经验: 不要把所有信息都塞进 Label。Label 应该简洁,Hint 用来补充。比如「发送」按钮,Label 就是「发送」,Hint 可以是「将消息发送给当前联系人」。这样用户先听到核心操作,再听到细节,不会信息过载。

另外,accessibilityTraits 也很重要。它告诉 VoiceOver 这个控件是什么类型:

  • .button:按钮
  • .header:标题
  • .link:链接
  • .selected:选中状态
  • .adjustable:可调节(比如滑块)

我曾经接手过一个项目,所有按钮都用了默认的 .button trait,但有个「点赞」按钮其实是个开关(已点赞/未点赞)。用户点进去后完全不知道当前状态。加上 .selected trait 后,VoiceOver 会读「已点赞,按钮」,问题就解决了。

避坑指南

最后分享几个我踩过的坑:

  • 不要用图片做按钮却不加 Label。纯图标按钮在 VoiceOver 下就是个「未标记的图片」,用户完全不知道能点。
  • 动态内容要更新 accessibilityLabel。比如购物车数量变化后,记得重新设置 Label,否则 VoiceOver 读的还是旧数据。
  • 慎用 isAccessibilityElement = false。把某个元素设为不可见,意味着 VoiceOver 用户完全无法访问它。除非你确定这个元素真的不需要被感知。

好了,VoiceOver 的基础就这些。下一章我们会深入「焦点管理」——说白了就是怎么让 VoiceOver 用户像我们用眼睛一样,快速找到他们想要的东西。


公众号:蓝海资料掘金营,微信deep3321