如何断开Navigation Bar与VoiceOver的关联并修改其无障碍属性生效
导航栏VoiceOver属性配置不生效解决方案
代码失效核心原因
- 你错误获取了
UINavigationController本身的navigationItem,该对象和当前页面的导航配置无关,实际需要操作的是当前UIViewController实例自带的navigationItem属性 backBarButtonItem的配置逻辑为:A页面push跳转至B页面时,B页面显示的返回按钮配置由A页面的navigationItem.backBarButtonItem决定。你在当前ThirdViewController中设置自身的backBarButtonItem,仅会作用于后续从ThirdViewController跳转的下一级页面的返回按钮,不会对当前页面生效
可行配置方案
方案1:在上一级页面配置返回按钮
如果当前ThirdViewController是从SecondViewController跳转而来,直接在SecondViewController中配置自身的backBarButtonItem即可:
import UIKit class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 配置下一级页面的返回按钮属性 let customBackButton = UIBarButtonItem(title: "Turkey", style: .plain, target: nil, action: nil) customBackButton.accessibilityLabel = "Turkey" // 如需完全关闭VoiceOver识别,打开下面这行代码 // customBackButton.isAccessibilityElement = false self.navigationItem.backBarButtonItem = customBackButton } }
方案2:在当前页面直接遍历修改返回按钮属性
如果不想修改上一级页面代码,可以在当前页面的viewWillAppear生命周期中遍历导航栏子视图,直接修改返回按钮的无障碍属性:
import UIKit class ThirdViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() title = "Third ViewController" } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) handleAccessibility() } func handleAccessibility() { guard let navigationBar = navigationController?.navigationBar else { return } // 遍历找到导航栏内的返回按钮 for subview in navigationBar.subviews { if let backButton = subview as? UIButton, backButton.description.contains("BackButton") { backButton.accessibilityLabel = "Turkey" // 如需完全关闭VoiceOver识别,打开下面这行代码 // backButton.isAccessibilityElement = false break } } // 如果你需要完全屏蔽整个导航栏的VoiceOver识别,直接用下面这行代码即可 // navigationBar.accessibilityElementsHidden = true } }
内容的提问来源于stack exchange,提问作者Frederick C. Lee
相关产品推荐
相关产品推荐

