UIAccessibility宣布自定义视图中的n个元素中的n个

时间:2019-02-15 16:16:49

标签: ios swift uiaccessibility

当您向视图添加UISegmentedControl时,UIAccessibility将专注于该视图并说:

"(Selected) ItemName Button 1 of 2"
"ItemName Button 2 of 2"

我有一个自定义控件,该控件的UIButtons切换方式类似于UISegmentedControl。但是我想弄清楚的是如何使“画外音”在最后宣布n of n

我发现最接近的事情是在容器上分配.accessibilityTraits = .tabBar。问题是它宣布:

"ItemName Button Tab 2 of 2"

但是要符合我们的辅助功能准则,我们不能让它宣布“标签”。

https://developer.apple.com/documentation/uikit/uiaccessibility/uiaccessibilitytraits/1648592-tabbar

只需编写一个自定义accessibilityLabel,UIAccessibility中是否可以处理此逻辑?

2 个答案:

答案 0 :(得分:0)

  

我有一个自定义控件,该控件的UIButton类似于UISegmentedControl。但是我想弄清楚的是如何使Voice Over在最后宣布n的n。

  • 将每个UIButton元素分别放在自定义控件的accessibilityElements数组中,就像容器一样。
  • 通过搜索此数组中的特定元素,您将在按钮总数“ N”内有一个索引“ x”:“项目名称按钮x为N”
  • 在您的UIButton中,插入先前研究的结果来设置accessibilityLabel

enter image description here 这是一种逻辑,应该可以通过一些代码来帮助您实现目标,例如(Xcode 10.2.1,Swift 5.0,iOS 12)

class ButtonsViewController: UIViewController {

    @IBOutlet weak var myCustomContainer: UIView!

    @IBOutlet weak var btn1: UIButton!
    @IBOutlet weak var btn2: UIButton!
    @IBOutlet weak var btn3: UIButton!


    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        myCustomContainer.accessibilityElements = [btn1!, btn2!, btn3!]
        let nbButtons = myCustomContainer.accessibilityElements?.count

        for (index, elt) in (myCustomContainer.accessibilityElements?.enumerated())! {

            let btn = elt as! UIButton
            let btnName = btn.titleLabel?.text

            btn.accessibilityLabel = btnName! + String(index + 1) + " of " + String(describing: nbButtons!)
        }
    }
}

答案 1 :(得分:0)

  1. 设置容器视图的accessibilityTraits = .tabBar
  2. 设置容器视图的accessibilityElements = [button1, button2]
  3. 必要时设置每个按钮的 accessibilityTraits = .selected 或 .none