VoiceOver基础:开启与关闭、基本手势、转子操作、自定义标签
好,咱们今天聊聊 VoiceOver。这是 iOS 无障碍的基石,也是每个开发者必须掌握的第一课。
说实话,我刚接触 VoiceOver 时也觉得有点懵。一个看不见屏幕的人,怎么跟手机交互?后来我亲自闭着眼睛试了十分钟,才真正理解——这不是「盲人专用模式」,而是一套全新的交互逻辑。你想想看,我们平时靠眼睛定位,而 VoiceOver 用户靠的是手指滑动和声音反馈。
开启与关闭:三种方式
先解决最基础的问题:怎么打开它?
方式一:设置路径
「设置」→「辅助功能」→「旁白」→ 打开开关。这是最稳妥的方式,适合第一次配置。
方式二:Siri 唤醒
直接说「嘿 Siri,打开旁白」。我个人习惯用这个,尤其是在测试时手忙脚乱的时候。
方式三:快捷键(我最推荐的)
连按三次侧边按钮(iPhone X 及以后机型),或者连按三次 Home 键(旧机型)。
基本手势:记住这五个就够了
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