我正在为我的应用添加VoiceOver支持.到目前为止,这么好,但我真的希望能够指定哪个元素是UIAccessibilityScreenChangedNotification之后的第一个元素.我还没有看到这样做的方法.制作一些摘要元素似乎并没有真正做到这一点.我错过了什么吗?
使用辅助功能
虽然VoiceOver按顺序读取应用程序中的元素,但无论如何都要将焦点转移到元素之间?我尝试使用"nextResponder",但它无法正常工作.
概述:
我很难理解如何在与 IOS 13+ 兼容的SwiftUI 视图中以编程方式正确转移辅助功能焦点。
不幸的是,这意味着无法使用 IOS 15+ 中提供的较新的 SwiftUI 焦点管理 API。
我看到的大多数建议与以下帖子类似:
它建议使用UIAccessibility.post(notification: .screenChanged/layoutChanged) argument: View)来更改焦点
然而,我的尝试没有成功。
我已经能够以与下面的代码相同的方式成功使用UIAccessibility.post(notification: .announcement) argument: String),并且它确实按预期宣布了刺痛。它花费的时间比 asyncAfter 计时器要长得多(可能需要 8 秒),但它似乎表明 post() 调用正在工作。
代码示例:
自定义展开/折叠,带有 V 形向上或向下,具体取决于它是展开还是折叠。
我希望能够以编程方式控制焦点扩展时的位置。例如,我可能希望能够让 VoiceOver 聚焦在打开的扩展菜单中的“菜单项 3”上。
我认为接近下面代码的东西可能会起作用,但我对帖子中的参数视图如何工作缺乏了解,并且不确定是否有办法使用 SwiftUI 视图,或者我是否需要创建一个UIKit 视图并使用 UIViewRepresentable 或使用 UIHostingController 包装它?
目前的行为
展开菜单时,VoiceOver 会移至第一项。当菜单折叠时,VoiceOver 焦点将转移到最后一个文本视图。
期望的行为
我希望能够在展开菜单时明确决定 VoiceOver 焦点的位置,并能够在视图出现时将更多焦点集中到特定视图
我还考虑了使用 SwiftUI/IOS 13+ 中提供的工具的其他方法。例如,我使用accessibility(sortPriority:)和accessibilityElement(children: .combine/.contain/.ignore)来达到预期的结果,但这些努力也被证明是不成功的。
代码搜索:
以下 GitHub 搜索目前分别产生 10 和 13 个结果:
在这些结果中,SwiftUI 视图中使用的结果使用了“nil”参数(据说将焦点转移到屏幕上的第一项)
这让我怀疑我是否真的偏离了轨道。 …