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

bar*_*ett 5 ios voiceover uiaccessibility swift

当您将 UISegmentedControl 添加到视图时,UIAccessibility将关注它并说:

"(Selected) ItemName Button 1 of 2"
"ItemName Button 2 of 2"
Run Code Online (Sandbox Code Playgroud)

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

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

"(Selected) ItemName Button 1 of 2"
"ItemName Button 2 of 2"
Run Code Online (Sandbox Code Playgroud)

但为了符合我们的可访问性指南,我们不能让它宣布“选项卡”。

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

除了编写自定义之外,accessibilityLabelUIAccessibility 中是否有任何内容可以处理此逻辑?

XLE*_*_22 0

我有一个自定义控件,其 UIButtons 的切换类似于 UISegmentedControl。但我想弄清楚的是如何让 Voice Over 在最后宣布 n of n 。

  • 将每个UIButton元素放入accessibilityElements自定义控件的数组中,该控件的作用类似于容器。
  • 通过搜索该数组中的特定元素,您将在总共“N”个按钮中拥有一个索引“x”:“item name button x of N”
  • 在您的 中UIButtonaccessibilityLabel通过插入先前研究的结果来设置。

在此输入图像描述 下面是一种逻辑,可以帮助您通过一些代码实现您的目的,例如(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!)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)