iOS SwiftUI如何阻止VoiceOver朗读Text视图内容且保留无障碍可用性
解决方案
1. 屏蔽Text默认朗读同时保留无障碍可访问性
不要直接给Text加.accessibility(hidden: true),而是将Text放在外层容器中,仅隐藏Text自身的无障碍属性,给外层容器配置自定义无障碍参数即可:
ScrollView { // 外层承载容器,负责无障碍交互 VStack { Text("你需要展示的长文本内容") // 仅隐藏Text自身的默认无障碍读取逻辑,不影响外层容器的可访问性 .accessibility(hidden: true) } // 将外层容器标记为独立无障碍元素 .accessibilityElement(children: .combine) // 自定义标签,不要填入文本内容即可避免自动朗读原文 .accessibilityLabel("自定义朗读文本区域") // 补充操作提示,告知视障用户支持的交互方式 .accessibilityHint("轻点选中区域,双指轻点可暂停/继续朗读,上下滑动切换句子,左右滑动切换段落") // 标记为可交互的无障碍元素 .accessibilityRespondsToUserInteraction(true) }
该方案下Text本身的内容不会被VoiceOver自动读取,外层容器仍然会出现在无障碍树中,可被VoiceOver正常选中交互。
2. 配置自定义手势与控制逻辑
在承载内容的容器上添加无障碍动作,即可实现你需要的AVSpeechSynthesizer控制逻辑:
// 接上面的ScrollView配置,继续追加修饰符 .accessibilityAction(.magicTap) { // 处理暂停/继续逻辑 if yourSpeechSynthesizer.isSpeaking { yourSpeechSynthesizer.pauseSpeaking(at: .word) } else { yourSpeechSynthesizer.continueSpeaking() } } // 向上滑动:跳转上一句 .accessibilityAction(.scrollUp) { jumpToPreviousSentence() } // 向下滑动:跳转下一句 .accessibilityAction(.scrollDown) { jumpToNextSentence() } // 向左滑动:跳转上一段 .accessibilityAction(.scrollLeft) { jumpToPreviousParagraph() } // 向右滑动:跳转下一段 .accessibilityAction(.scrollRight) { jumpToNextParagraph() }
如果需要更多自定义操作,还可以添加自定义无障碍动作:
.accessibilityCustomActions([ UIAccessibilityCustomAction(name: "跳转到文本开头", handler: { _ in // 你的跳转逻辑 return true }) ])
3. 修复magicTap触发系统音乐的问题
magicTap事件会优先传递给当前获得VoiceOver焦点的可交互元素,没有可响应元素时才会触发系统全局操作(如控制音乐播放),你可以在页面加载时主动将VoiceOver焦点定位到文本区域:
.onAppear { // 页面加载完成后通知VoiceOver布局变更,将焦点定位到文本区域 UIAccessibility.post(notification: .layoutChanged, argument: nil) // 启动自定义朗读前可主动暂停VoiceOver避免播报冲突 UIAccessibility.post(notification: .pauseAssistiveTechnology, argument: UIAccessibility.AssistiveTechnologyIdentifier.voiceOver.rawValue) } .onDisappear { // 页面退出时恢复VoiceOver UIAccessibility.post(notification: .resumeAssistiveTechnology, argument: UIAccessibility.AssistiveTechnologyIdentifier.voiceOver.rawValue) }
内容的提问来源于stack exchange,提问作者Melodius
相关产品推荐
相关产品推荐

