Hide UITableViewCell from VoiceOver



我有一个静态UITableView,里面有各种单元格。我需要隐藏/显示其中的一些单元格,所以我在适当的时候实现了heightForRowAtIndexPathreturn 0,以便隐藏正确的单元格。这对有视力的用户非常有效,但对于那些使用VoiceOver的用户来说,这些元素在不应该突出显示的时候仍然可以访问。当我将这些UITableViewCell的高度更改为0时,我如何确保它们不再可以访问?

我试着将单元格设置为不可访问的元素,并将元素设置为隐藏,但这对它没有影响。该单元格没有被子类化,它只是一个UITableViewCell。我没有设置任何关于单元格的可访问性或单元格内容(textLabeldetailTextLabel)的内容。

不起作用:

self.cellToHide.isAccessibilityElement = NO;
self.cellToHide.accessibilityElementsHidden = YES;

通过重新加载单元格更新单元格VoiceOver元素

在阅读了UITableView控制辅助功能元素并观察到具有类似功能的应用程序后,我认为TableView必须在加载或重新加载单元格时更新其辅助功能信息。我尝试在更改其辅助功能属性后强制重新加载单元格,这解决了问题。VoiceOver信息已更新。

以下是在点击有问题的单元格时运行的代码示例。或者,它可以在其他事件需要更新VoiceOver元素时运行。

// Make changes to accessibility properties such as
cell.isAccessibilityElement = false
cell.accessibilityElementsHidden = true
// reloadRows() allows VoiceOver to update its element list for the related cell(s)
// "indexPath" is for the desired row
// reloadRows() expects an array of IndexPaths so an array of one is created inline
tableView.reloadRows(at: [indexPath], with: .automatic)
// Calling UIAccessibilityPostNotification() is not necessary to realize the VoiceOver changes in the TableViewCell

 

背景

在找到解决办法之前,我与这个问题争论了一会儿。在我的例子中,TableView单元格是在代码中创建的。这里没有故事板或笔尖。但是,无论TableView是如何构造的,该解决方案都应该能够工作。

我有自定义的、子类化的TableView单元格,这些单元格的视图层次结构构建在代码中,并作为UITableViewCell的contentView的子视图添加。我假设我可以修改各种子视图的isAccessibilityElement和/或accessibilityElementsHidden属性,并调用UIAccessibilityPostNotification()来实现VoiceOver更改,就像我在TableView之外所做的那样。VoiceOver无法识别这些更改,只能识别加载单元格时单元格所处的可访问性状态。

对于我努力处理的单元格,高度会动态变化,以适应在单元格点击时显示和隐藏的DatePicker。我只希望DatePicker在屏幕上可见时对VoiceOver可见。如果可能的话,我尽量避免重新加载TableView、Section或Rows以进行动态更改。如果必须重新加载,我会尽量将其隔离(重新加载一个单元格或一个部分,而不是整个TableView)。在这种情况下,我不需要重新加载任何内容来使单元格展开以显示DatePicker,因此我没有尝试重新加载单元格以进行辅助功能更新。

相关信息:苹果网站上的UIAccessibility API参考资料

设置accessibilityElementHidden后,尝试添加以下代码。

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, yourTableView);

最新更新