swift-ios-辅助功能-先将Voiceover的读/焦点顺序更改为内容视图,然后再更改导航项?

时间:2018-11-16 23:32:42

标签: ios swift accessibility voiceover tab-ordering

我正在设计一个启用了辅助功能的应用程序。我有 rightBarButtonItem上的navigationBar,之间有几个标签 和位于底部的按钮。

我想要实现以下行为: 每次加载当前视图时,VoiceOver焦点将:

  1. 从最上面的标签开始
  2. 从上到下访问所有标签
  3. 然后,点击底部按钮
  4. 最后,rightBarButtonItem

为了确保这种顺序,我在viewController

中进行了编码
navigationController?.view.accessibilityElements = [label1, label2, button, navigationItem.rightBarButtonItem]

它确实确保了读取顺序,但是焦点顺序在rightBarButtonItem处失败。无法点击。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

每次加载当前视图时,请使用UIAccessibilityPostNotification方法来达到目的。

有几种类型的变更通知,但是 UIAccessibilityScreenChangedNotification 可能是您感兴趣的一种。

它通知整个页面已更改,包括nilUIObject作为传入参数:

  • 使用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

完成后,您可以使用此方法进行自定义,并先按顺序阅读/关注内容视图,然后再按问题中所述的导航项进行操作。

此解决方案可能已经过优化,但可以实现您的目标。