我希望为画外音用户实现一些类似于Apple在他们的音乐应用中处理miniplayer的方式。
在miniplayer中,有许多辅助功能元素:专辑封面,曲目元数据,播放和前进按钮。当用户首先选择迷你层内的元素时,配音文件会在给出所选元素的标签之前读取“Miniplayer;双击以展开miniplayer”。但是如果你在miniplayer中的元素之间导航,它将只给出每个元素的标签,特征和提示。当您从miniplayer外部的元素移动到miniplayer内的元素时,它将仅提供Miniplayer(容器级别)标签和提示。
能够为配音用户提供这种环境似乎是良好的用户体验设计,但是如何实现呢?我理解如何通过将元素包含在myItem.accessibilityElements
数组中来组合元素,而不是如何确定用户选择的当前/前一个元素是否是同一个容器的一部分。
要通知VoiceOver用户在容器中选择了一个元素,您可以为容器中的每种元素创建一个类(使用泛型可能???)来覆盖UIAccessibilityFocus
非正式协议的方法。
让我们举一个例子,假设我们下面的蓝色容器中只有标签(代码适用于其他类型的元素):
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(布尔变量应该足够)。