结合UISwitch和UITableViewCell进行VoiceOver交互

时间:2014-06-30 20:43:54

标签: ios objective-c uitableview uiswitch voiceover

在日历中,当您创建新事件时,如果您点击启用了VoiceOver的全天单元格,Siri会打开/关闭全天开关按钮,双击以更改设置"。实际上,双击将切换开关。此外,它不可能仅仅点击切换开关本身 - 您必须与单元本身交互以切换开关,交换机本身不是可访问的元素。

在我的应用程序中,我使用标签和开关进行完全相同的设置。但是当我在启用VoiceOver的情况下点击单元格时,它只会读取标签,因此盲人用户不知道该单元格中有一个切换开关。如果他们点击开关本身,那么他们就可以与之交互,因此它与日历应用中的设置相反。

如何获得Apple实施的相同行为?我需要一些方法将开关组合到单元格中,以便VoiceOver在突出显示单元格时读取它们,然后当它们双击它时应该切换开关,并且我不确定如何完成该设置。谢谢!

3 个答案:

答案 0 :(得分:10)

要实现所需的行为,而不是将UISwitch放在单元格的contentView中,请以编程方式将其添加为accessoryView。然后,在使用VoiceOver时,单元格和开关的行为与预期完全一致,就像在日历中一样。

答案 1 :(得分:1)

您应该能够使用

在单元格上设置自定义辅助功能描述
cell.accessibilityLabel = @"Double tap to toggle setting";

您可以根据以下答案设置VoiceOver运行时的自定义手势:

https://stackoverflow.com/a/12337128/567511

但是在这里你不需要自定义手势,而didSelectRowAtIndexPath仅在UIAccessibilityIsVoiceOverRunning为真时才会翻转开关。

答案 2 :(得分:1)

我想详细说明the answer of Joey,并澄清如何在代码中实现此问题的解决方案。

tableView:cellForRowAtIndexPath:中,创建一个自定义UISwitch视图并将其附加到单元格的accessoryView。这可能类似于以下内容。

UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
[switchView setOn:NO];
[switchView addTarget:self action:@selector(selector:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = switchView;

return cell;

现在,该单元的行为与任何已知的本机iOS开关相同。 设置日历。在启用VoiceOver的情况下双击单元格,现在将切换UISwitch(开/关),VoiceOver将自动通知用户有关交换机的状态以及可访问性提示。