iOS弹出新ViewController时如何切换Accessibility焦点?
问题原因分析
- 你调用
UIAccessibility.post时传入的参数是第一个VC的视图,导致系统收到通知后仍然聚焦第一个VC的元素,这是核心错误 - 通知调用时机不对:如果在
viewDidLoad、viewWillAppear阶段发送通知,此时第二个VC的视图还未完全加入系统视图层级,通知不会生效 accessibilityViewIsModal需要设置在第二个VC的根视图上,作用是屏蔽下层所有可访问元素,避免VoiceOver读到第一个VC的内容
无障碍切换逻辑说明
- VoiceOver不会自动感知VC切换事件,需要开发者主动发送系统通知告知屏幕内容变更
.screenChanged通知的argument参数用于指定跳转后第一个被朗读的元素,可以传第二个VC的根视图、导航栏标题或其他你希望优先朗读的控件accessibilityViewIsModal = true必须和通知搭配使用,仅设置该属性无法触发焦点自动切换
解决示例代码
在第二个VC中添加如下代码即可:
class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 屏蔽下层第一个VC的所有可访问元素 view.accessibilityViewIsModal = true } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 视图完全渲染后发送通知,指定第二个VC的根视图为首个聚焦元素 UIAccessibility.post(notification: .screenChanged, argument: view) } // 如果需要返回第一个VC时自动切回焦点,可添加以下代码 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIAccessibility.post(notification: .screenChanged, argument: presentingViewController?.view ?? navigationController?.topViewController?.view) } }
内容的提问来源于stack exchange,提问作者monk
相关产品推荐
相关产品推荐

