You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:45:04