从presented ViewController返回时如何让VoiceOver聚焦宿主VC的指定触发元素
问题1 强制VoiceOver聚焦并播报触发源按钮的解决方案
你原有代码中直接修改宿主VC的accessibilityElements的写法是错误的,会导致宿主VC除了目标按钮外的所有元素都无法被VoiceOver识别,需要先删除该语句。
正确实现需要在弹窗dismiss动画完成的回调中发送系统级的VoiceOver通知,通知系统布局变更并指定聚焦目标:
@IBAction func exitAction(_ sender: UIButton) { guard let hostVC = delegate as? ThirdViewController else { return } dismiss(animated: true) { // 通知VoiceOver布局变更,自动聚焦到指定元素并播报其 accessibilityLabel UIAccessibility.post(notification: .layoutChanged, argument: hostVC.doSomethingButton) // 如果需要强制重复播报标签,可额外发送公告通知 UIAccessibility.post(notification: .announcement, argument: hostVC.doSomethingButton.accessibilityLabel) } }
问题2 聚焦其他VC中带点击手势的UIView的解决方案
完全可以,只要给目标UIView完成基础的可访问性配置即可,配置后聚焦逻辑和UIButton完全一致:
- 先在宿主VC中给触发用的UIView配置可访问性属性:
// 假设你的触发源是名为 triggerView 的 UIView fileprivate func setupTriggerViewAccessibility() { // 开启可访问性,允许VoiceOver识别 triggerView.isAccessibilityElement = true triggerView.accessibilityLabel = "自定义触发按钮" // 配置特性为按钮,VoiceOver会按照按钮的逻辑处理交互 triggerView.accessibilityTraits = .button triggerView.accessibilityHint = "点击打开弹窗" // 原有点击手势正常添加即可,不影响VoiceOver聚焦 let tap = UITapGestureRecognizer(target: self, action: #selector(openPopup)) triggerView.addGestureRecognizer(tap) }
- 弹窗关闭时聚焦逻辑和按钮完全一致,把
UIAccessibility.post的参数换成该UIView即可。
内容的提问来源于stack exchange,提问作者Frederick C. Lee
相关产品推荐
相关产品推荐

