通知画外音用户他们突出显示了容器中的元素

问题描述 投票:1回答:1

我希望为画外音用户实现一些类似于Apple在他们的音乐应用中处理miniplayer的方式。

在miniplayer中,有许多辅助功能元素:专辑封面,曲目元数据,播放和前进按钮。当用户首先选择迷你层内的元素时,配音文件会在给出所选元素的标签之前读取“Miniplayer;双击以展开miniplayer”。但是如果你在miniplayer中的元素之间导航,它将只给出每个元素的标签,特征和提示。当您从miniplayer外部的元素移动到miniplayer内的元素时,它将仅提供Miniplayer(容器级别)标签和提示。

能够为配音用户提供这种环境似乎是良好的用户体验设计,但是如何实现呢?我理解如何通过将元素包含在myItem.accessibilityElements数组中来组合元素,而不是如何确定用户选择的当前/前一个元素是否是同一个容器的一部分。

ios voiceover uiaccessibility
1个回答
0
投票

要通知VoiceOver用户在容器中选择了一个元素,您可以为容器中的每种元素创建一个类(使用泛型可能???)来覆盖UIAccessibilityFocus非正式协议的方法。

让我们举一个例子,假设我们下面的蓝色容器中只有标签(代码适用于其他类型的元素):enter image description here

  • 为标签创建一个类,包括它所属的superview的属性。 class EltLabel : UILabel { var containerView: UIView? { get { return self.superview } set { } } }
  • 在新创建的类的扩展中重写UIAccessibilityFocus非正式协议方法。 extension EltLabel { override open func accessibilityElementDidBecomeFocused() { if self.accessibilityElementIsFocused() { // Actions to be done when the element did become focused. } } override open func accessibilityElementDidLoseFocus() { if self.accessibilityElementIsFocused() { // Actions to be done when the element did lose focus. } } override open func accessibilityElementIsFocused() -> Bool { guard let containerView = self.containerView else { return false } return (self.isDescendant(of: containerView)) ? true : false } }
  • 不要忘记使用您的标签创建出口,一切都会自动处理。 class BoutonViewController: UIViewController { @IBOutlet weak var label1: EltLabel! @IBOutlet weak var label2: EltLabel! }

要修改并包含在代码环境中的此代码段将通知VoiceOver用户他们已根据需要突出显示容器中的元素。

现在,如果要“确定用户选择的当前/上一个元素是否是同一容器的一部分”,只需在视图控制器中添加一个变量,每当容器的一个元素集中时,该变量将递增/递减/ unfocused(布尔变量应该足够)。

© www.soinside.com 2019 - 2024. All rights reserved.