从VoiceOver隐藏UITableViewCell

时间:2015-03-27 21:19:17

标签: ios objective-c uitableview uiaccessibility

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

我尝试将单元格设置为不是可访问元素,并将元素设置为隐藏但这对它没有影响。该单元格尚未被子类化 - 它只是UITableViewCell。我没有在单元格的可访问性和单元格的内容(textLabeldetailTextLabel)上设置任何内容。

不行诀:

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

2 个答案:

答案 0 :(得分:1)

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

在阅读了UITableView控制Accessibility元素并观察具有类似功能的应用程序之后,我发现TableView必须在加载或重新加载单元格时更新其Accessibility信息。我尝试在更改其Accessibility属性后强制单元格重新加载,这解决了问题。 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,Sections或Rows以进行动态更改。如果我必须重新加载,我尝试使其尽可能隔离(重新加载一个单元格或一个部分而不是整个TableView)。在这种情况下,我不需要重新加载任何东西以使单元格展开以显示DatePicker,因此我没有尝试重新加载单元格以进行辅助功能更新。

相关信息:UIAccessibility API Reference on Apple's web site

答案 1 :(得分:0)

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

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, yourTableView);