我正在设计一个启用了辅助功能的应用程序。我有
rightBarButtonItem
上的navigationBar
,之间有几个标签
和位于底部的按钮。
我想要实现以下行为: 每次加载当前视图时,VoiceOver焦点将:
为了确保这种顺序,我在viewController
navigationController?.view.accessibilityElements = [label1, label2, button, navigationItem.rightBarButtonItem]
它确实确保了读取顺序,但是焦点顺序在rightBarButtonItem处失败。无法点击。
如何解决这个问题?
答案 0 :(得分:0)
每次加载当前视图时,请使用UIAccessibilityPostNotification方法来达到目的。
有几种类型的变更通知,但是 UIAccessibilityScreenChangedNotification 可能是您感兴趣的一种。
它通知整个页面已更改,包括nil
或UIObject
作为传入参数:
nil
,页面中的第一个可访问元素将成为焦点。 UIObject
,焦点将转移到指定的元素。此通知附带声音,包括宣布新页面的声音。
编辑
我误解了你的问题,这比我想象的要复杂得多。
如果要对导航栏项产生影响,则应使本机项不可访问,并创建自己的自定义元素来订购和/或添加自定义操作。
让我们以一个带有标签,按钮和一个包含右键栏按钮的导航栏为例(我不考虑潜在的back button)。
在您的视图控制器中遵循以下步骤:
STEP 1 :创建您的店铺。
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myButton: UIButton!
@IBOutlet weak var myRightBarItem: UIBarButtonItem!
第2步:隐藏导航栏项,以免听其发声。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController!.navigationBar.accessibilityElementsHidden = true
}
第3步:为右栏按钮创建一个可访问元素。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let rightButtonView = myRightBarItem.value(forKey: "view") as? UIView
let navigationBarView = rightButtonView?.superview?.superview?.superview
let newElt = UIAccessibilityElement(accessibilityContainer: self.view)
newElt.accessibilityFrameInContainerSpace = navigationBarView!.convert((rightButtonView?.superview!.frame)!,
to:self.view)
newElt.accessibilityLabel = "new navigation right bar button"
newElt.accessibilityTraits = .button
//Order your elements as you wish.
self.view.accessibilityElements = [myLabel,
myButton,
newElt]
}
最后一步是根据您的应用目的,在右侧栏按钮上添加一个动作or more。
完成后,您可以使用此方法进行自定义,并先按顺序阅读/关注内容视图,然后再按问题中所述的导航项进行操作。
此解决方案可能已经过优化,但可以实现您的目标。