UIAccessibility - 当关闭另一个视图时,将焦点设置到上一个辅助功能元素
Posted
技术标签:
【中文标题】UIAccessibility - 当关闭另一个视图时,将焦点设置到上一个辅助功能元素【英文标题】:UIAccessibility - When dismissing another view, set focus to previous accessibility element 【发布时间】:2019-04-08 22:14:18 【问题描述】:我正在我们当前的项目中实现可访问性,但在将焦点设置在以前的视图控制器中的元素上时遇到了一些问题。
一个例子是:
用户在索引 3 处的 tableview 单元格上进行选择。在didSelectRowAt
中,我们向用户显示UIActionSheet
,用户在其中进行选择。一旦用户做出选择并且呈现的UIActionSheet
被解除,可访问性焦点应该在tableview 单元格索引3 处选择,但是焦点被设置回视图中的初始元素,在我的例子中是最左上角的元素.
我使用UIAccessibility.Notification
.screenChanged
和UIView.accessibilityViewIsModal
在呈现模态视图时设置新焦点,但这似乎没有一个很好的解决方案来在关闭视图时指向前一个元素。
任何关于如何跟踪先前可访问性元素焦点的见解将不胜感激。
【问题讨论】:
【参考方案1】:首先,创建一个变量来存储TableViewController
中的先前位置:
var previousPosition: IndexPath?
然后,一旦你点击一个单元格,就存储这个位置:
override func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath)
previousPosition = indexPath
最后,当呈现的UIActionSheet
被关闭时(后面的后退按钮示例),下面的代码 sn-p 选择并聚焦触发了最新点击的表格视图单元格:
var actionSheet: UIAlertController?
actionSheet = UIAlertController(title: "Action Sheet",
message: "Ready to go back?",
preferredStyle: .actionSheet)
let backButton = UIAlertAction(title: "B.A.C.K.",
style: .cancel,
handler: (action) -> Void in
print("Back button tapped")
self.tableView.selectRow(at: self.previousPosition,
animated: true,
scrollPosition: .none)
let currentCell = self.tableView.cellForRow(at: self.previousPosition!)
UIAccessibility.post(notification:.layoutChanged,
argument: currentCell)
)
actionSheet!.addAction(backButton)
在一个空白项目中检查此代码 sn-p 的结果,并在您的应用中对其进行调整以使其按需要工作。
EDIT:除了我的代码 sn-p 之外,看看表视图的 remembersLastFocusedIndexPath
实例属性,它可以提供直接结果restoresFocusAfterTransition
视图控制器的实例属性。
【讨论】:
以上是关于UIAccessibility - 当关闭另一个视图时,将焦点设置到上一个辅助功能元素的主要内容,如果未能解决你的问题,请参考以下文章
iOS:带有复选框的 UIAccessibility(配音)无法正常工作
如何使用 UIAccessibility 协议在 iOS 上的模式弹出窗口中捕获焦点?
Swift 5.2 UIAccessibility.isAssistiveTouchRunning 永远不会返回 true,也不会触发 UIAccessibility.assistiveTouchSt