ios - UIAccessibilityElement `accessibilityCustomActions` 无法正常工作

标签 ios swift uiaccessibility

我创建了一个 UIAccessibilityElement 实例,以便提供一组自定义操作以及一些附加信息(即 accessibilityLabel + accessibilityHint )

问题是 VoiceOver 不会宣布自定义操作的存在。他们在那里,他们工作,但不被宣布。此外,自定义操作的提示也未公布。

有什么想法吗?

生成元素的代码如下:

private lazy var accessibilityOverviewElement: UIAccessibilityElement = {
    let element = UIAccessibilityElement(accessibilityContainer: self)
    element.accessibilityLabel = viewModel.accessibilityOverviewTitle
    element.accessibilityHint = viewModel.accessibilityOverviewHint
    element.isAccessibilityElement = true

    let close = UIAccessibilityCustomAction(
        name: viewModel.accessibilityCloseActionTitle,
        target: self,
        selector: #selector(self.accessibilityDidClose))
    close.accessibilityHint = viewModel.accessibilityCloseActionHint

    let expand = UIAccessibilityCustomAction(
        name: viewModel.accessibilityExpandActionTitle,
        target: self,
        selector: #selector(self.accessibilityDidExpand))
    expand.accessibilityHint = viewModel.accessibilityExpandActionHint

    element.accessibilityCustomActions = [close, expand]
    return element
}()

我在 viewDidLayoutSubviews() 中计算元素的框架

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    var frame = view.bounds
    frame.size.height = SleepAidMinifiedPlayerViewController.defaultHeight
    accessibilityOverviewElement.accessibilityFrameInContainerSpace = frame
}

最后,我需要能够启用/禁用可访问性,因为这个 View Controller 从底部滑动并隐藏,但它并没有完全从 View 层次结构中移除(所以 VoiceOver 仍然关注它的元素)

func setAccessibility(enabled isEnabled: Bool) {
    view.accessibilityElements = isEnabled ? [accessibilityOverviewElement, /* + other accessible elements*/].compactMap { $0 } : []
}

谢谢!

最佳答案

Any ideas?

我已经创建了一个关于这个问题的雷达:VoiceOver 不再读出自定义操作 - 2019 年 11 月 4 日下午 5:01 – FB7426771.

描述:“原生地,在 iOS 13 中,VoiceOver 不会宣布可用的操作,即使它们存在也是如此:例如在闹钟设置中,选择一个闹钟并且不会读出任何操作(在 iOS 12 中没问题) 当它们存在时。 此外,如果我在具有自定义操作的应用程序中创建一个元素,它们不会在 iOS 13 中公布,但如果我知道它们在这里,则可以使用它们(上下滑动以获取它们)。 但是,如果我使用针对 iOS 12 的较旧应用程序,我的包含自定义操作的元素会用 iOS 12 设备宣布的“可用操作”完美拼写,而 iOS 13 设备确实“有时”宣布它们。 请在下一个 iOS 13.3 版本中纠正这个巨大的倒退,因为它对 VoiceOver 用户来说是极其不利的。”

此后没有答案,但在未来的版本中提供解决方案很重要:我期待在下一个版本中看到此更正 release notes .

但是,您的实现应该使您的应用按预期工作,在我看来这不是问题 ⇒ 有 many useful examples (代码 + 插图) 如果您需要有关某些 VoiceOver 实现的进一步解释。

让您的应用程序在 iOS 12 下运行并注意它可以正常工作,而在 iOS 13 下则不然。😰

⚠️ ⬛️◼️🔳▪️ 编辑 ▪️🔳◼️⬛️ ⚠️ (2020/03/17)

The problem is that VoiceOver doesn't announce the existence of custom actions. They are there, they work, but don't get announced. Also, custom actions' hint is not being announced as well.

即使您没有提及您正在使用的 iOS 版本,我也认为这是 iOS 13,因为引入了这种奇怪的行为,这使得它在此版本:Apple 网站上没有 WWDC 视频或信息。 😤

dedicated a11y site提到了这个修改 ⟹ “iOS 13 引入了一个新的自定义操作行为:“可用操作”公告不再总是存在。
它以前提供给包含自定义操作的每个元素,但现在,当您导航到包含一组不同操作的另一个元素时,它就会发生。
目的是防止在与前一个元素存在相同操作的元素上重复通告。”
🤓

看看this SO answer突出显示有关此主题的技术支持事件的响应。 😉

结论:如果您需要在每个元素上使用自定义操作的公告,请使用 iOS 12,否则您'将不得不处理这种在任何地方都没有解释的新行为,并且对于 VoiceOver 用户来说绝对没有效率⟹ Apple 技术支持声称这就是它的工作方式从现在开始。😰

⚠️ ⬛️◼️🔳▪️ 编辑 ▪️🔳◼️⬛️ ⚠️ (2022/11/15)

我再也没有这个问题了,即使在 iOS 15 中也是如此。🥳
如果您在 iOS 16 中仍然处于同样糟糕的情况,我建议您检查您是否在设备设置中勾选了 Accessibility-VoiceOver-Verbosity-Actions-Speak 框,以使其正常工作预期 (⟹ source )。 👍

但是,我没有从 Apple 收到关于我的 TSI 的消息。 😵‍💫

关于ios - UIAccessibilityElement `accessibilityCustomActions` 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59307946/

相关文章:

ios - 无法访问 kABPersonNoteProperty

swift - segue 后模糊背景 View

ios - UIAccessibilityCustomAction 选择器不适用于静态方法

ios - 如何为 tableview 上的 webview 内容启用 VoiceOver

ios - 如何使 Objective-C 类符合 Swift 中定义的协议(protocol)?

ios - 从 FMDB 数据库中获取数据

swift - 为什么我不能将 noOfChildren 转换为整数?

ios - 从 TableView 拖放到 Swift 中的另一个 View

javascript - 专注于关闭模态框或弹出窗口

ios - 如何在 swift 中从选定的 tableviewcell 中过滤数组?