繁体   English   中英

swift-ios- Accessibility - 首先将 Voiceover 阅读/焦点顺序更改为内容视图然后导航项目?

[英]swift-ios- Accessibility - change Voiceover read/focus order to content view first then the navigation items?

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

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

  1. 从最顶层开始 label
  2. 从上到下访问所有标签
  3. 然后,底部按钮
  4. 最后,右键BarButtonItem

为了确保这样的顺序,我在viewController中进行了编码

navigationController?.view.accessibilityElements = [label1, label2, button, navigationItem.rightBarButtonItem]

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

如何解决这个问题呢?

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

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

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

  • 使用nil ,页面中的第一个可访问元素将获得焦点。
  • 使用UIObject焦点将转移到指定的元素

该通知伴随着发声,包括宣布新页面的声音。


编辑

我误解了您的问题,这个问题比我想象的要复杂得多。

如果要影响导航栏项目,则应使本机项目不可访问,并创建自己的自定义元素以订购和/或添加自定义动作。

让我们以带有标签,按钮和导航栏的示例为例,该导航栏包括一个右栏按钮(我不考虑潜在的后退按钮 )。

在您的视图控制器中执行以下步骤:

步骤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]
}

最后一步是根据您的应用目的,在右侧栏按钮中添加一个或多个操作。

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

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

您可以添加 function 作为 UIAccessibility 扩展,以便在加载屏幕时将焦点设置在任何项目上,然后执行 accessibilityElements

extension UIAccessibility {

static func setFocusTo(_ object: Any?) {
    if UIAccessibility.isVoiceOverRunning {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
            UIAccessibility.post(notification: .layoutChanged, argument: object)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM